| Index: src/compiler/bytecode-graph-builder.cc
|
| diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc
|
| index 10ded107ed718071dc64b51a60b1cdbd1a378da5..c0fcc87b449d886987de99ccb2d00dbcbc1ae55f 100644
|
| --- a/src/compiler/bytecode-graph-builder.cc
|
| +++ b/src/compiler/bytecode-graph-builder.cc
|
| @@ -1293,10 +1293,8 @@ void BytecodeGraphBuilder::VisitCreateObjectLiteral() {
|
| literal, Environment::kAttachFrameState);
|
| }
|
|
|
| -Node* BytecodeGraphBuilder::ProcessCallArguments(const Operator* call_op,
|
| - Node* callee,
|
| - interpreter::Register receiver,
|
| - size_t arity) {
|
| +Node* const* BytecodeGraphBuilder::GetCallArgumentsFromRegister(
|
| + Node* callee, interpreter::Register receiver, size_t arity) {
|
| Node** all = local_zone()->NewArray<Node*>(static_cast<int>(arity));
|
| all[0] = callee;
|
| all[1] = environment()->LookupRegister(receiver);
|
| @@ -1305,34 +1303,133 @@ Node* BytecodeGraphBuilder::ProcessCallArguments(const Operator* call_op,
|
| all[i] = environment()->LookupRegister(
|
| interpreter::Register(receiver_index + i - 1));
|
| }
|
| - Node* value = MakeNode(call_op, static_cast<int>(arity), all, false);
|
| - return value;
|
| + return all;
|
| +}
|
| +
|
| +Node* BytecodeGraphBuilder::ProcessCallArguments(const Operator* call_op,
|
| + Node* const* args,
|
| + size_t arg_count) {
|
| + return MakeNode(call_op, static_cast<int>(arg_count), args, false);
|
| +}
|
| +
|
| +Node* BytecodeGraphBuilder::ProcessCallArguments(const Operator* call_op,
|
| + Node* callee,
|
| + interpreter::Register receiver,
|
| + size_t arg_count) {
|
| + return ProcessCallArguments(
|
| + call_op, GetCallArgumentsFromRegister(callee, receiver, arg_count),
|
| + arg_count);
|
| }
|
|
|
| void BytecodeGraphBuilder::BuildCall(TailCallMode tail_call_mode,
|
| - ConvertReceiverMode receiver_hint) {
|
| + ConvertReceiverMode receiver_hint,
|
| + Node* const* args, size_t arg_count,
|
| + int slot_id) {
|
| PrepareEagerCheckpoint();
|
|
|
| - Node* callee =
|
| - environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| - interpreter::Register receiver = bytecode_iterator().GetRegisterOperand(1);
|
| - size_t arg_count = bytecode_iterator().GetRegisterCountOperand(2);
|
| -
|
| // Slot index of 0 is used indicate no feedback slot is available. Assert
|
| // the assumption that slot index 0 is never a valid feedback slot.
|
| STATIC_ASSERT(FeedbackVector::kReservedIndexCount > 0);
|
| - int const slot_id = bytecode_iterator().GetIndexOperand(3);
|
| VectorSlotPair feedback = CreateVectorSlotPair(slot_id);
|
|
|
| float const frequency = ComputeCallFrequency(slot_id);
|
| - const Operator* call = javascript()->Call(arg_count + 1, frequency, feedback,
|
| + const Operator* call = javascript()->Call(arg_count, frequency, feedback,
|
| receiver_hint, tail_call_mode);
|
| - Node* value = ProcessCallArguments(call, callee, receiver, arg_count + 1);
|
| + Node* value = ProcessCallArguments(call, args, arg_count);
|
| environment()->BindAccumulator(value, Environment::kAttachFrameState);
|
| }
|
|
|
| +void BytecodeGraphBuilder::BuildCallVarArgs(TailCallMode tail_call_mode,
|
| + ConvertReceiverMode receiver_hint) {
|
| + Node* callee =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + interpreter::Register receiver = bytecode_iterator().GetRegisterOperand(1);
|
| + size_t arg_count = bytecode_iterator().GetRegisterCountOperand(2);
|
| + int const slot_id = bytecode_iterator().GetIndexOperand(3);
|
| + BuildCall(tail_call_mode, receiver_hint,
|
| + GetCallArgumentsFromRegister(callee, receiver, arg_count + 1),
|
| + arg_count + 1, slot_id);
|
| +}
|
| +
|
| void BytecodeGraphBuilder::VisitCall() {
|
| - BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kAny);
|
| + BuildCallVarArgs(TailCallMode::kDisallow, ConvertReceiverMode::kAny);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitCall0() {
|
| + Node* callee =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + Node* receiver =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
|
| + int const slot_id = bytecode_iterator().GetIndexOperand(2);
|
| + BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kAny,
|
| + {callee, receiver}, slot_id);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitCall1() {
|
| + Node* callee =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + Node* receiver =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
|
| + Node* arg0 =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(2));
|
| + int const slot_id = bytecode_iterator().GetIndexOperand(3);
|
| + BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kAny,
|
| + {callee, receiver, arg0}, slot_id);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitCall2() {
|
| + Node* callee =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + Node* receiver =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
|
| + Node* arg0 =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(2));
|
| + Node* arg1 =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(3));
|
| + int const slot_id = bytecode_iterator().GetIndexOperand(4);
|
| + BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kAny,
|
| + {callee, receiver, arg0, arg1}, slot_id);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitCallProperty() {
|
| + BuildCallVarArgs(TailCallMode::kDisallow,
|
| + ConvertReceiverMode::kNotNullOrUndefined);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitCallProperty0() {
|
| + Node* callee =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + Node* receiver =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
|
| + int const slot_id = bytecode_iterator().GetIndexOperand(2);
|
| + BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kNotNullOrUndefined,
|
| + {callee, receiver}, slot_id);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitCallProperty1() {
|
| + Node* callee =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + Node* receiver =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
|
| + Node* arg0 =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(2));
|
| + int const slot_id = bytecode_iterator().GetIndexOperand(3);
|
| + BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kNotNullOrUndefined,
|
| + {callee, receiver, arg0}, slot_id);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitCallProperty2() {
|
| + Node* callee =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + Node* receiver =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
|
| + Node* arg0 =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(2));
|
| + Node* arg1 =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(3));
|
| + int const slot_id = bytecode_iterator().GetIndexOperand(4);
|
| + BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kNotNullOrUndefined,
|
| + {callee, receiver, arg0, arg1}, slot_id);
|
| }
|
|
|
| void BytecodeGraphBuilder::VisitCallWithSpread() {
|
| @@ -1348,16 +1445,12 @@ void BytecodeGraphBuilder::VisitCallWithSpread() {
|
| environment()->BindAccumulator(value, Environment::kAttachFrameState);
|
| }
|
|
|
| -void BytecodeGraphBuilder::VisitCallProperty() {
|
| - BuildCall(TailCallMode::kDisallow, ConvertReceiverMode::kNotNullOrUndefined);
|
| -}
|
| -
|
| void BytecodeGraphBuilder::VisitTailCall() {
|
| TailCallMode tail_call_mode =
|
| bytecode_array_->GetIsolate()->is_tail_call_elimination_enabled()
|
| ? TailCallMode::kAllow
|
| : TailCallMode::kDisallow;
|
| - BuildCall(tail_call_mode, ConvertReceiverMode::kAny);
|
| + BuildCallVarArgs(tail_call_mode, ConvertReceiverMode::kAny);
|
| }
|
|
|
| void BytecodeGraphBuilder::VisitCallJSRuntime() {
|
| @@ -2265,7 +2358,8 @@ void BytecodeGraphBuilder::EnterAndExitExceptionHandlers(int current_offset) {
|
| }
|
|
|
| Node* BytecodeGraphBuilder::MakeNode(const Operator* op, int value_input_count,
|
| - Node** value_inputs, bool incomplete) {
|
| + Node* const* value_inputs,
|
| + bool incomplete) {
|
| DCHECK_EQ(op->ValueInputCount(), value_input_count);
|
|
|
| bool has_context = OperatorProperties::HasContextInput(op);
|
|
|