Index: src/compiler/instruction-selector.cc |
diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc |
index 0e3f341f4f2a1c16d88e4deece82138e7dc4bc27..503cca031f64203fca0b4a5ac17aa2427bcc0c83 100644 |
--- a/src/compiler/instruction-selector.cc |
+++ b/src/compiler/instruction-selector.cc |
@@ -298,10 +298,12 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer, |
for (size_t i = 0; i < buffer->output_nodes.size(); i++) { |
if (buffer->output_nodes[i] != NULL) { |
Node* output = buffer->output_nodes[i]; |
+ MachineType type = |
+ buffer->descriptor->GetReturnType(static_cast<int>(i)); |
LinkageLocation location = |
buffer->descriptor->GetReturnLocation(static_cast<int>(i)); |
- MarkAsRepresentation(location.representation(), output); |
- buffer->outputs.push_back(g.DefineAsLocation(output, location)); |
+ MarkAsRepresentation(type, output); |
+ buffer->outputs.push_back(g.DefineAsLocation(output, location, type)); |
} |
} |
} |
@@ -325,7 +327,8 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer, |
break; |
case CallDescriptor::kCallJSFunction: |
buffer->instruction_args.push_back( |
- g.UseLocation(callee, buffer->descriptor->GetInputLocation(0))); |
+ g.UseLocation(callee, buffer->descriptor->GetInputLocation(0), |
+ buffer->descriptor->GetInputType(0))); |
break; |
} |
DCHECK_EQ(1, buffer->instruction_args.size()); |
@@ -343,8 +346,8 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer, |
AddFrameStateInputs(frame_state, &buffer->instruction_args, |
buffer->frame_state_descriptor); |
} |
- DCHECK_EQ(1 + buffer->frame_state_value_count(), |
- buffer->instruction_args.size()); |
+ DCHECK(1 + buffer->frame_state_value_count() == |
+ buffer->instruction_args.size()); |
int input_count = buffer->input_count(); |
@@ -360,7 +363,8 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer, |
DCHECK((*iter)->op()->opcode() != IrOpcode::kFrameState); |
if (index == 0) continue; // The first argument (callee) is already done. |
InstructionOperand* op = |
- g.UseLocation(*iter, buffer->descriptor->GetInputLocation(index)); |
+ g.UseLocation(*iter, buffer->descriptor->GetInputLocation(index), |
+ buffer->descriptor->GetInputType(index)); |
if (UnallocatedOperand::cast(op)->HasFixedSlotPolicy()) { |
int stack_index = -UnallocatedOperand::cast(op)->fixed_slot_index() - 1; |
if (static_cast<size_t>(stack_index) >= buffer->pushed_nodes.size()) { |
@@ -484,9 +488,8 @@ void InstructionSelector::VisitNode(Node* node) { |
case IrOpcode::kFinish: |
return VisitFinish(node); |
case IrOpcode::kParameter: { |
- LinkageLocation location = |
- linkage()->GetParameterLocation(OpParameter<int>(node)); |
- MarkAsRepresentation(location.representation(), node); |
+ MachineType type = linkage()->GetParameterType(OpParameter<int>(node)); |
+ MarkAsRepresentation(type, node); |
return VisitParameter(node); |
} |
case IrOpcode::kPhi: |
@@ -822,8 +825,10 @@ void InstructionSelector::VisitFinish(Node* node) { |
void InstructionSelector::VisitParameter(Node* node) { |
OperandGenerator g(this); |
- Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetParameterLocation( |
- OpParameter<int>(node)))); |
+ int index = OpParameter<int>(node); |
+ Emit(kArchNop, |
+ g.DefineAsLocation(node, linkage()->GetParameterLocation(index), |
+ linkage()->GetParameterType(index))); |
} |
@@ -987,7 +992,8 @@ void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, |
void InstructionSelector::VisitReturn(Node* value) { |
OperandGenerator g(this); |
if (value != NULL) { |
- Emit(kArchRet, NULL, g.UseLocation(value, linkage()->GetReturnLocation())); |
+ Emit(kArchRet, NULL, g.UseLocation(value, linkage()->GetReturnLocation(), |
+ linkage()->GetReturnType())); |
} else { |
Emit(kArchRet, NULL); |
} |