| Index: src/interpreter/interpreter-assembler.cc
|
| diff --git a/src/interpreter/interpreter-assembler.cc b/src/interpreter/interpreter-assembler.cc
|
| index a4fddffa16464d7c4a730de779c28158642ff351..e8ba7a3fa7b6cfc99dd549257a45f8a7929a8e65 100644
|
| --- a/src/interpreter/interpreter-assembler.cc
|
| +++ b/src/interpreter/interpreter-assembler.cc
|
| @@ -492,6 +492,7 @@ void InterpreterAssembler::CallEpilogue() {
|
|
|
| Node* InterpreterAssembler::IncrementCallCount(Node* type_feedback_vector,
|
| Node* slot_id) {
|
| + Comment("increment call count");
|
| Node* call_count_slot = IntPtrAdd(slot_id, IntPtrConstant(1));
|
| Node* call_count =
|
| LoadFixedArrayElement(type_feedback_vector, call_count_slot);
|
| @@ -748,24 +749,20 @@ Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context,
|
| // are uninitialized, monomorphic (indicated by a JSFunction), and
|
| // megamorphic.
|
| // TODO(mythria/v8:5210): Check if it is better to mark extra_checks as a
|
| - // deferred block so that call_construct_function will be scheduled just
|
| - // after increment_count and in the fast path we can reduce one branch in
|
| - // the
|
| - // fast path.
|
| - Label increment_count(this), extra_checks(this),
|
| - call_construct_function(this);
|
| + // deferred block so that call_construct_function will be scheduled.
|
| + Label extra_checks(this), call_construct_function(this);
|
|
|
| Node* feedback_element =
|
| LoadFixedArrayElement(type_feedback_vector, slot_id);
|
| Node* feedback_value = LoadWeakCellValue(feedback_element);
|
| Node* is_monomorphic = WordEqual(constructor, feedback_value);
|
| - BranchIf(is_monomorphic, &increment_count, &extra_checks);
|
| + BranchIf(is_monomorphic, &call_construct_function, &extra_checks);
|
|
|
| Bind(&extra_checks);
|
| {
|
| Label mark_megamorphic(this), initialize(this),
|
| check_allocation_site(this), check_initialized(this),
|
| - set_alloc_feedback_and_inc_count(this);
|
| + set_alloc_feedback_and_call(this);
|
| {
|
| // Check if it is a megamorphic target
|
| Comment("check if megamorphic");
|
| @@ -798,14 +795,14 @@ Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context,
|
| LoadFixedArrayElement(LoadNativeContext(context),
|
| Int32Constant(Context::ARRAY_FUNCTION_INDEX));
|
| Node* is_array_function = WordEqual(context_slot, constructor);
|
| - BranchIf(is_array_function, &set_alloc_feedback_and_inc_count,
|
| + BranchIf(is_array_function, &set_alloc_feedback_and_call,
|
| &mark_megamorphic);
|
| }
|
|
|
| - Bind(&set_alloc_feedback_and_inc_count);
|
| + Bind(&set_alloc_feedback_and_call);
|
| {
|
| allocation_feedback.Bind(feedback_element);
|
| - Goto(&increment_count);
|
| + Goto(&call_construct_function);
|
| }
|
|
|
| Bind(&check_initialized);
|
| @@ -819,8 +816,7 @@ Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context,
|
|
|
| Bind(&initialize);
|
| {
|
| - Label initialize_count(this), create_weak_cell(this),
|
| - create_allocation_site(this);
|
| + Label create_weak_cell(this), create_allocation_site(this);
|
| Comment("initialize the feedback element");
|
| // Check that it is the Array() function.
|
| Node* context_slot =
|
| @@ -839,22 +835,13 @@ Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context,
|
| Node* feedback_element =
|
| LoadFixedArrayElement(type_feedback_vector, slot_id);
|
| allocation_feedback.Bind(feedback_element);
|
| - Goto(&initialize_count);
|
| + Goto(&call_construct_function);
|
| }
|
|
|
| Bind(&create_weak_cell);
|
| {
|
| CreateWeakCellInFeedbackVector(type_feedback_vector, SmiTag(slot_id),
|
| constructor);
|
| - Goto(&initialize_count);
|
| - }
|
| -
|
| - Bind(&initialize_count);
|
| - {
|
| - Node* call_count_slot = IntPtrAdd(slot_id, IntPtrConstant(1));
|
| - // Count is Smi, so we don't need a write barrier.
|
| - StoreFixedArrayElement(type_feedback_vector, call_count_slot,
|
| - SmiTag(Int32Constant(1)), SKIP_WRITE_BARRIER);
|
| Goto(&call_construct_function);
|
| }
|
| }
|
| @@ -874,23 +861,10 @@ Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context,
|
| }
|
| }
|
|
|
| - Bind(&increment_count);
|
| - {
|
| - // Increment the call count.
|
| - Comment("increment call count");
|
| - Node* call_count_slot = IntPtrAdd(slot_id, IntPtrConstant(1));
|
| - Node* call_count =
|
| - LoadFixedArrayElement(type_feedback_vector, call_count_slot);
|
| - Node* new_count = SmiAdd(call_count, SmiTag(Int32Constant(1)));
|
| - // Count is Smi, so we don't need a write barrier.
|
| - StoreFixedArrayElement(type_feedback_vector, call_count_slot, new_count,
|
| - SKIP_WRITE_BARRIER);
|
| - Goto(&call_construct_function);
|
| - }
|
| -
|
| Bind(&call_construct_function);
|
| {
|
| Comment("call using callConstructFunction");
|
| + IncrementCallCount(type_feedback_vector, slot_id);
|
| Callable callable_function = CodeFactory::InterpreterPushArgsAndConstruct(
|
| isolate(), CallableType::kJSFunction);
|
| return_value.Bind(CallStub(callable_function.descriptor(),
|
|
|