Reduction CommonOperatorReducer::ReduceReturn(Node* node) {
...
Node* effect = NodeProperties::GetEffectInput(node);
Node* pop_count = NodeProperties::GetValueInput(node, 0);
Node* value = NodeProperties::GetValueInput(node, 1);
Node* control = NodeProperties::GetControlInput(node);
if
(value->opcode() == IrOpcode::kPhi &&
NodeProperties::GetControlInput(value) == control &&
control->opcode() == IrOpcode::kMerge) {
Node::Inputs control_inputs = control->inputs();
Node::Inputs value_inputs = value->inputs();
DCHECK_NE(0, control_inputs.count());
DCHECK_EQ(control_inputs.count(), value_inputs.count() - 1);
DCHECK_EQ(IrOpcode::kEnd, graph()->end()->opcode());
DCHECK_NE(0, graph()->end()->InputCount());
if
(control->OwnedBy(node, value) && value->OwnedBy(node)) {
for
(
int
i = 0; i < control_inputs.count(); ++i) {
Node* ret = graph()->NewNode(node->op(), pop_count, value_inputs[i],
effect, control_inputs[i]);
MergeControlToEnd(graph(), common(), ret);
}
Replace(control, dead());
return
Replace(dead());
}
...
}
return
NoChange();
}