| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index 733624e86622f16e253309a0b1749fd004efed77..0e3f341f4f2a1c16d88e4deece82138e7dc4bc27 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -271,8 +271,7 @@ CallBuffer::CallBuffer(Zone* zone, CallDescriptor* d,
|
| output_nodes.reserve(d->ReturnCount());
|
| outputs.reserve(d->ReturnCount());
|
| pushed_nodes.reserve(input_count());
|
| - instruction_args.reserve(input_count() + control_count() +
|
| - frame_state_value_count());
|
| + instruction_args.reserve(input_count() + frame_state_value_count());
|
| }
|
|
|
|
|
| @@ -280,9 +279,7 @@ CallBuffer::CallBuffer(Zone* zone, CallDescriptor* d,
|
| // InstructionSelector::VisitCall platform independent instead.
|
| void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
|
| bool call_code_immediate,
|
| - bool call_address_immediate,
|
| - BasicBlock* cont_node,
|
| - BasicBlock* deopt_node) {
|
| + bool call_address_immediate) {
|
| OperandGenerator g(this);
|
| DCHECK_EQ(call->op()->OutputCount(), buffer->descriptor->ReturnCount());
|
| DCHECK_EQ(OperatorProperties::GetValueInputCount(call->op()),
|
| @@ -338,9 +335,9 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
|
| // arg 1 : deoptimization id.
|
| // arg 2 - arg (n + 1) : value inputs to the frame state.
|
| if (buffer->frame_state_descriptor != NULL) {
|
| - int deoptimization_id =
|
| - sequence()->AddDeoptimizationEntry(buffer->frame_state_descriptor);
|
| - buffer->instruction_args.push_back(g.TempImmediate(deoptimization_id));
|
| + InstructionSequence::StateId state_id =
|
| + sequence()->AddFrameStateDescriptor(buffer->frame_state_descriptor);
|
| + buffer->instruction_args.push_back(g.TempImmediate(state_id.ToInt()));
|
|
|
| Node* frame_state = call->InputAt(buffer->descriptor->InputCount());
|
| AddFrameStateInputs(frame_state, &buffer->instruction_args,
|
| @@ -377,22 +374,9 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
|
| }
|
| }
|
| CHECK_EQ(pushed_count, static_cast<int>(buffer->pushed_nodes.size()));
|
| -
|
| - // If the call can deoptimize, we add the continuation and deoptimization
|
| - // block labels.
|
| - if (buffer->descriptor->CanLazilyDeoptimize()) {
|
| - DCHECK(cont_node != NULL);
|
| - DCHECK(deopt_node != NULL);
|
| - buffer->instruction_args.push_back(g.Label(cont_node));
|
| - buffer->instruction_args.push_back(g.Label(deopt_node));
|
| - } else {
|
| - DCHECK(cont_node == NULL);
|
| - DCHECK(deopt_node == NULL);
|
| - }
|
| -
|
| DCHECK(static_cast<size_t>(input_count) ==
|
| - (buffer->instruction_args.size() - buffer->control_count() +
|
| - buffer->pushed_nodes.size() - buffer->frame_state_value_count()));
|
| + (buffer->instruction_args.size() + buffer->pushed_nodes.size() -
|
| + buffer->frame_state_value_count()));
|
| }
|
|
|
|
|
| @@ -465,14 +449,6 @@ void InstructionSelector::VisitControl(BasicBlock* block) {
|
| }
|
| case BasicBlockData::kThrow:
|
| return VisitThrow(input);
|
| - case BasicBlockData::kDeoptimize:
|
| - return VisitDeoptimize(input);
|
| - case BasicBlockData::kCall: {
|
| - BasicBlock* deoptimization = block->SuccessorAt(0);
|
| - BasicBlock* continuation = block->SuccessorAt(1);
|
| - VisitCall(input, continuation, deoptimization);
|
| - break;
|
| - }
|
| case BasicBlockData::kNone: {
|
| // TODO(titzer): exit block doesn't have control.
|
| DCHECK(input == NULL);
|
| @@ -503,8 +479,6 @@ void InstructionSelector::VisitNode(Node* node) {
|
| case IrOpcode::kIfFalse:
|
| case IrOpcode::kEffectPhi:
|
| case IrOpcode::kMerge:
|
| - case IrOpcode::kLazyDeoptimization:
|
| - case IrOpcode::kContinuation:
|
| // No code needed for these graph artifacts.
|
| return;
|
| case IrOpcode::kFinish:
|
| @@ -1028,13 +1002,13 @@ void InstructionSelector::VisitThrow(Node* value) {
|
| FrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor(
|
| Node* state) {
|
| DCHECK(state->op()->opcode() == IrOpcode::kFrameState);
|
| - BailoutId ast_id = OpParameter<BailoutId>(state);
|
| + FrameStateCallInfo state_info = OpParameter<FrameStateCallInfo>(state);
|
| Node* parameters = state->InputAt(0);
|
| Node* locals = state->InputAt(1);
|
| Node* stack = state->InputAt(2);
|
|
|
| return new (instruction_zone())
|
| - FrameStateDescriptor(ast_id, OpParameter<int>(parameters),
|
| + FrameStateDescriptor(state_info, OpParameter<int>(parameters),
|
| OpParameter<int>(locals), OpParameter<int>(stack));
|
| }
|
|
|
| @@ -1060,6 +1034,11 @@ void InstructionSelector::AddFrameStateInputs(
|
| Node* parameters = state->InputAt(0);
|
| Node* locals = state->InputAt(1);
|
| Node* stack = state->InputAt(2);
|
| + Node* context = state->InputAt(3);
|
| +
|
| + DCHECK_EQ(IrOpcode::kStateValues, parameters->op()->opcode());
|
| + DCHECK_EQ(IrOpcode::kStateValues, locals->op()->opcode());
|
| + DCHECK_EQ(IrOpcode::kStateValues, stack->op()->opcode());
|
|
|
| DCHECK_EQ(descriptor->parameters_count(), parameters->InputCount());
|
| DCHECK_EQ(descriptor->locals_count(), locals->InputCount());
|
| @@ -1069,6 +1048,7 @@ void InstructionSelector::AddFrameStateInputs(
|
| for (int i = 0; i < descriptor->parameters_count(); i++) {
|
| inputs->push_back(UseOrImmediate(&g, parameters->InputAt(i)));
|
| }
|
| + inputs->push_back(UseOrImmediate(&g, context));
|
| for (int i = 0; i < descriptor->locals_count(); i++) {
|
| inputs->push_back(UseOrImmediate(&g, locals->InputAt(i)));
|
| }
|
| @@ -1078,26 +1058,6 @@ void InstructionSelector::AddFrameStateInputs(
|
| }
|
|
|
|
|
| -void InstructionSelector::VisitDeoptimize(Node* deopt) {
|
| - DCHECK(deopt->op()->opcode() == IrOpcode::kDeoptimize);
|
| - Node* state = deopt->InputAt(0);
|
| - FrameStateDescriptor* descriptor = GetFrameStateDescriptor(state);
|
| - int deoptimization_id = sequence()->AddDeoptimizationEntry(descriptor);
|
| -
|
| - InstructionOperandVector inputs(zone());
|
| - inputs.reserve(descriptor->size() + 1);
|
| -
|
| - OperandGenerator g(this);
|
| - inputs.push_back(g.TempImmediate(deoptimization_id));
|
| -
|
| - AddFrameStateInputs(state, &inputs, descriptor);
|
| -
|
| - DCHECK_EQ(descriptor->size() + 1, inputs.size());
|
| -
|
| - Emit(kArchDeoptimize, 0, NULL, inputs.size(), &inputs.front(), 0, NULL);
|
| -}
|
| -
|
| -
|
| #if !V8_TURBOFAN_BACKEND
|
|
|
| #define DECLARE_UNIMPLEMENTED_SELECTOR(x) \
|
|
|