| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index 0ae1c63fea2a336dc55028d2dfa62267e125490f..0efdd065551fefc346ebaf3240852de82fbf97cb 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -360,7 +360,8 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
|
| Node* frame_state =
|
| call->InputAt(static_cast<int>(buffer->descriptor->InputCount()));
|
| AddFrameStateInputs(frame_state, &buffer->instruction_args,
|
| - buffer->frame_state_descriptor);
|
| + buffer->frame_state_descriptor,
|
| + FrameStateInputKind::kStackSlot);
|
| }
|
| DCHECK(1 + buffer->frame_state_value_count() ==
|
| buffer->instruction_args.size());
|
| @@ -1016,7 +1017,7 @@ void InstructionSelector::VisitDeoptimize(Node* value) {
|
| sequence()->AddFrameStateDescriptor(desc);
|
| args.push_back(g.TempImmediate(state_id.ToInt()));
|
|
|
| - AddFrameStateInputs(value, &args, desc);
|
| + AddFrameStateInputs(value, &args, desc, FrameStateInputKind::kAny);
|
|
|
| DCHECK_EQ(args.size(), arg_count);
|
|
|
| @@ -1059,7 +1060,8 @@ FrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor(
|
| }
|
|
|
|
|
| -static InstructionOperand SlotOrImmediate(OperandGenerator* g, Node* input) {
|
| +InstructionOperand InstructionSelector::OperandForDeopt(
|
| + OperandGenerator* g, Node* input, FrameStateInputKind kind) {
|
| switch (input->opcode()) {
|
| case IrOpcode::kInt32Constant:
|
| case IrOpcode::kNumberConstant:
|
| @@ -1067,19 +1069,27 @@ static InstructionOperand SlotOrImmediate(OperandGenerator* g, Node* input) {
|
| case IrOpcode::kHeapConstant:
|
| return g->UseImmediate(input);
|
| default:
|
| - return g->UseUniqueSlot(input);
|
| + switch (kind) {
|
| + case FrameStateInputKind::kStackSlot:
|
| + return g->UseUniqueSlot(input);
|
| + case FrameStateInputKind::kAny:
|
| + return g->Use(input);
|
| + }
|
| + UNREACHABLE();
|
| + return InstructionOperand();
|
| }
|
| }
|
|
|
|
|
| -void InstructionSelector::AddFrameStateInputs(
|
| - Node* state, InstructionOperandVector* inputs,
|
| - FrameStateDescriptor* descriptor) {
|
| +void InstructionSelector::AddFrameStateInputs(Node* state,
|
| + InstructionOperandVector* inputs,
|
| + FrameStateDescriptor* descriptor,
|
| + FrameStateInputKind kind) {
|
| DCHECK_EQ(IrOpcode::kFrameState, state->op()->opcode());
|
|
|
| if (descriptor->outer_state()) {
|
| AddFrameStateInputs(state->InputAt(kFrameStateOuterStateInput), inputs,
|
| - descriptor->outer_state());
|
| + descriptor->outer_state(), kind);
|
| }
|
|
|
| Node* parameters = state->InputAt(kFrameStateParametersInput);
|
| @@ -1098,23 +1108,23 @@ void InstructionSelector::AddFrameStateInputs(
|
|
|
| OperandGenerator g(this);
|
| size_t value_index = 0;
|
| - inputs->push_back(SlotOrImmediate(&g, function));
|
| + inputs->push_back(OperandForDeopt(&g, function, kind));
|
| descriptor->SetType(value_index++, kMachAnyTagged);
|
| for (StateValuesAccess::TypedNode input_node :
|
| StateValuesAccess(parameters)) {
|
| - inputs->push_back(SlotOrImmediate(&g, input_node.node));
|
| + inputs->push_back(OperandForDeopt(&g, input_node.node, kind));
|
| descriptor->SetType(value_index++, input_node.type);
|
| }
|
| if (descriptor->HasContext()) {
|
| - inputs->push_back(SlotOrImmediate(&g, context));
|
| + inputs->push_back(OperandForDeopt(&g, context, kind));
|
| descriptor->SetType(value_index++, kMachAnyTagged);
|
| }
|
| for (StateValuesAccess::TypedNode input_node : StateValuesAccess(locals)) {
|
| - inputs->push_back(SlotOrImmediate(&g, input_node.node));
|
| + inputs->push_back(OperandForDeopt(&g, input_node.node, kind));
|
| descriptor->SetType(value_index++, input_node.type);
|
| }
|
| for (StateValuesAccess::TypedNode input_node : StateValuesAccess(stack)) {
|
| - inputs->push_back(SlotOrImmediate(&g, input_node.node));
|
| + inputs->push_back(OperandForDeopt(&g, input_node.node, kind));
|
| descriptor->SetType(value_index++, input_node.type);
|
| }
|
| DCHECK(value_index == descriptor->GetSize());
|
|
|