Chromium Code Reviews| Index: src/compiler/js-inlining.cc |
| diff --git a/src/compiler/js-inlining.cc b/src/compiler/js-inlining.cc |
| index 6449fab1bf4477f53637fad829c59abc4c36a377..a5e98464798689a1314ffde66ea6c33a99668ae7 100644 |
| --- a/src/compiler/js-inlining.cc |
| +++ b/src/compiler/js-inlining.cc |
| @@ -165,50 +165,36 @@ Reduction JSInliner::InlineCall(Node* call, Node* start, Node* end) { |
| } |
| } |
| - // TODO(turbofan): This can be unified once End takes a variable number of |
| - // inputs. |
| - Node* value_output; |
| - Node* effect_output; |
| - Node* control_output; |
| - |
| - Node* final_merge = NodeProperties::GetControlInput(end); |
| - if (final_merge->opcode() == IrOpcode::kReturn) { |
| - value_output = NodeProperties::GetValueInput(final_merge, 0); |
| - effect_output = NodeProperties::GetEffectInput(final_merge, 0); |
| - control_output = NodeProperties::GetControlInput(final_merge, 0); |
| - } else { |
| - NodeVector values(local_zone_); |
| - NodeVector effects(local_zone_); |
| - NodeVector controls(local_zone_); |
| - DCHECK_EQ(IrOpcode::kMerge, final_merge->opcode()); |
| - for (Node* const input : final_merge->inputs()) { |
| - switch (input->opcode()) { |
| - case IrOpcode::kReturn: |
| - values.push_back(NodeProperties::GetValueInput(input, 0)); |
| - effects.push_back(NodeProperties::GetEffectInput(input)); |
| - controls.push_back(NodeProperties::GetControlInput(input)); |
| - break; |
| - default: |
| - // TODO(turbofan): Handle Throw, Terminate and Deoptimize here. |
| - UNREACHABLE(); |
| - break; |
| - } |
| + NodeVector values(local_zone_); |
| + NodeVector effects(local_zone_); |
| + NodeVector controls(local_zone_); |
| + for (Node* const input : end->inputs()) { |
| + switch (input->opcode()) { |
| + case IrOpcode::kReturn: |
| + values.push_back(NodeProperties::GetValueInput(input, 0)); |
| + effects.push_back(NodeProperties::GetEffectInput(input)); |
| + controls.push_back(NodeProperties::GetControlInput(input)); |
| + break; |
| + default: |
| + // TODO(turbofan): Handle Throw, Terminate and Deoptimize here. |
| + UNREACHABLE(); |
| + break; |
| } |
| - DCHECK_NE(0u, values.size()); |
| - DCHECK_EQ(values.size(), effects.size()); |
| - DCHECK_EQ(values.size(), controls.size()); |
| - int const input_count = static_cast<int>(controls.size()); |
| - control_output = jsgraph_->graph()->NewNode( |
| - jsgraph_->common()->Merge(input_count), input_count, &controls.front()); |
| - values.push_back(control_output); |
| - effects.push_back(control_output); |
| - value_output = jsgraph_->graph()->NewNode( |
| - jsgraph_->common()->Phi(kMachAnyTagged, input_count), |
| - static_cast<int>(values.size()), &values.front()); |
| - effect_output = jsgraph_->graph()->NewNode( |
| - jsgraph_->common()->EffectPhi(input_count), |
| - static_cast<int>(effects.size()), &effects.front()); |
| } |
| + DCHECK_NE(0u, values.size()); |
| + DCHECK_EQ(values.size(), effects.size()); |
| + DCHECK_EQ(values.size(), controls.size()); |
| + int const input_count = static_cast<int>(controls.size()); |
| + Node* control_output = jsgraph_->graph()->NewNode( |
| + jsgraph_->common()->Merge(input_count), input_count, &controls.front()); |
|
Michael Starzinger
2015/05/26 10:28:05
This will create a singleton Merge as well as sing
Benedikt Meurer
2015/05/26 10:29:31
Yes. My plan is to optimize this away later. For n
|
| + values.push_back(control_output); |
| + effects.push_back(control_output); |
| + Node* value_output = jsgraph_->graph()->NewNode( |
| + jsgraph_->common()->Phi(kMachAnyTagged, input_count), |
| + static_cast<int>(values.size()), &values.front()); |
| + Node* effect_output = jsgraph_->graph()->NewNode( |
| + jsgraph_->common()->EffectPhi(input_count), |
| + static_cast<int>(effects.size()), &effects.front()); |
| ReplaceWithValue(call, value_output, effect_output, control_output); |