Chromium Code Reviews| Index: src/type-feedback-vector-inl.h |
| diff --git a/src/type-feedback-vector-inl.h b/src/type-feedback-vector-inl.h |
| index 4675c62b8ccaaa6a39fc3a786e269bf318bf0305..b35b07010f50b986f65764041416961554421f95 100644 |
| --- a/src/type-feedback-vector-inl.h |
| +++ b/src/type-feedback-vector-inl.h |
| @@ -5,6 +5,7 @@ |
| #ifndef V8_TYPE_FEEDBACK_VECTOR_INL_H_ |
| #define V8_TYPE_FEEDBACK_VECTOR_INL_H_ |
| +#include "src/globals.h" |
| #include "src/type-feedback-vector.h" |
| namespace v8 { |
| @@ -52,7 +53,13 @@ TypeFeedbackVector* TypeFeedbackVector::cast(Object* obj) { |
| int TypeFeedbackMetadata::GetSlotSize(FeedbackVectorSlotKind kind) { |
| DCHECK_NE(FeedbackVectorSlotKind::INVALID, kind); |
| DCHECK_NE(FeedbackVectorSlotKind::KINDS_NUMBER, kind); |
| - return kind == FeedbackVectorSlotKind::GENERAL ? 1 : 2; |
| + if (kind == FeedbackVectorSlotKind::GENERAL || |
| + kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC || |
| + kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC) { |
| + return 1; |
| + } |
| + |
| + return 2; |
| } |
| bool TypeFeedbackMetadata::SlotRequiresName(FeedbackVectorSlotKind kind) { |
| @@ -65,6 +72,8 @@ bool TypeFeedbackMetadata::SlotRequiresName(FeedbackVectorSlotKind kind) { |
| case FeedbackVectorSlotKind::KEYED_LOAD_IC: |
| case FeedbackVectorSlotKind::STORE_IC: |
| case FeedbackVectorSlotKind::KEYED_STORE_IC: |
| + case FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC: |
| + case FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC: |
| case FeedbackVectorSlotKind::GENERAL: |
| case FeedbackVectorSlotKind::INVALID: |
| return false; |
| @@ -111,8 +120,35 @@ void TypeFeedbackVector::Set(FeedbackVectorSlot slot, Object* value, |
| set(GetIndex(slot), value, mode); |
| } |
| +// Helper function to transform the feedback to BinaryOperationHint. |
| +BinaryOperationHint BinaryOperationHintFromFeedback(int type_feedback) { |
| + switch (type_feedback) { |
| + case BinaryOperationFeedback::kSignedSmall: |
| + return BinaryOperationHint::kSignedSmall; |
| + case BinaryOperationFeedback::kNumber: |
| + return BinaryOperationHint::kNumberOrOddball; |
| + case BinaryOperationFeedback::kAny: |
| + default: |
| + return BinaryOperationHint::kAny; |
| + } |
| + UNREACHABLE(); |
| + return BinaryOperationHint::kNone; |
| +} |
| + |
| +// Helper function to transform the feedback to CompareOperationHint. |
| +CompareOperationHint CompareOperationHintFromFeedback(int type_feedback) { |
| + switch (type_feedback) { |
| + case CompareOperationFeedback::kSignedSmall: |
| + return CompareOperationHint::kSignedSmall; |
| + case CompareOperationFeedback::kNumber: |
| + return CompareOperationHint::kNumber; |
| + default: |
| + return CompareOperationHint::kAny; |
| + } |
| +} |
| -void TypeFeedbackVector::ComputeCounts(int* with_type_info, int* generic) { |
| +void TypeFeedbackVector::ComputeCounts(int* with_type_info, int* generic, |
| + bool code_is_interpreted) { |
| Object* uninitialized_sentinel = |
| TypeFeedbackVector::RawUninitializedSentinel(GetIsolate()); |
| Object* megamorphic_sentinel = |
| @@ -127,7 +163,36 @@ void TypeFeedbackVector::ComputeCounts(int* with_type_info, int* generic) { |
| Object* obj = Get(slot); |
| if (obj != uninitialized_sentinel && |
| kind != FeedbackVectorSlotKind::GENERAL) { |
| - if (obj->IsWeakCell() || obj->IsFixedArray() || obj->IsString()) { |
| + if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC || |
| + kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC) { |
| + // If we are not running interpreted code, we need to ignore |
| + // the special ic slots for binaryop/compare used by the |
| + // interpreter. |
| + // TODO(mvstanton): Remove code_is_interpreted when full code |
| + // is retired from service. |
| + if (code_is_interpreted) continue; |
|
Benedikt Meurer
2016/09/20 17:15:00
Ops, this is missing an exclamation mark.
|
| + |
| + DCHECK(obj->IsSmi()); |
| + int op_feedback = static_cast<int>(Smi::cast(obj)->value()); |
| + if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC) { |
| + CompareOperationHint hint = |
| + CompareOperationHintFromFeedback(op_feedback); |
| + if (hint == CompareOperationHint::kAny) { |
| + gen++; |
| + } else if (hint != CompareOperationHint::kNone) { |
| + with++; |
| + } |
| + } else { |
| + DCHECK(kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC); |
| + BinaryOperationHint hint = |
| + BinaryOperationHintFromFeedback(op_feedback); |
| + if (hint == BinaryOperationHint::kAny) { |
| + gen++; |
| + } else if (hint != BinaryOperationHint::kNone) { |
| + with++; |
| + } |
| + } |
| + } else if (obj->IsWeakCell() || obj->IsFixedArray() || obj->IsString()) { |
| with++; |
| } else if (obj == megamorphic_sentinel) { |
| gen++; |