| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index 17c227acc70d4636d409b94487ae48b96a6a33fc..4baa5958cacfdc92b156a92ac2413490ff6b0058 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -219,6 +219,23 @@ void InstructionSelector::MarkAsReference(Node* node) {
|
| }
|
|
|
|
|
| +void InstructionSelector::MarkAsRepresentation(MachineType rep,
|
| + InstructionOperand* op) {
|
| + UnallocatedOperand* unalloc = UnallocatedOperand::cast(op);
|
| + switch (RepresentationOf(rep)) {
|
| + case kRepFloat32:
|
| + case kRepFloat64:
|
| + sequence()->MarkAsDouble(unalloc->virtual_register());
|
| + break;
|
| + case kRepTagged:
|
| + sequence()->MarkAsReference(unalloc->virtual_register());
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| +}
|
| +
|
| +
|
| void InstructionSelector::MarkAsRepresentation(MachineType rep, Node* node) {
|
| DCHECK_NOT_NULL(node);
|
| switch (RepresentationOf(rep)) {
|
| @@ -274,15 +291,27 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
|
| }
|
|
|
| // Filter out the outputs that aren't live because no projection uses them.
|
| + size_t outputs_needed_by_framestate =
|
| + buffer->frame_state_descriptor == NULL
|
| + ? 0
|
| + : buffer->frame_state_descriptor->state_combine()
|
| + .ConsumedOutputCount();
|
| for (size_t i = 0; i < buffer->output_nodes.size(); i++) {
|
| - if (buffer->output_nodes[i] != NULL) {
|
| - Node* output = buffer->output_nodes[i];
|
| + bool output_is_live =
|
| + buffer->output_nodes[i] != NULL || i < outputs_needed_by_framestate;
|
| + if (output_is_live) {
|
| MachineType type =
|
| buffer->descriptor->GetReturnType(static_cast<int>(i));
|
| LinkageLocation location =
|
| buffer->descriptor->GetReturnLocation(static_cast<int>(i));
|
| - MarkAsRepresentation(type, output);
|
| - buffer->outputs.push_back(g.DefineAsLocation(output, location, type));
|
| +
|
| + Node* output = buffer->output_nodes[i];
|
| + InstructionOperand* op =
|
| + output == NULL ? g.TempLocation(location, type)
|
| + : g.DefineAsLocation(output, location, type);
|
| + MarkAsRepresentation(type, op);
|
| +
|
| + buffer->outputs.push_back(op);
|
| }
|
| }
|
| }
|
|
|