Index: src/type-feedback-vector-inl.h |
diff --git a/src/type-feedback-vector-inl.h b/src/type-feedback-vector-inl.h |
index da0ecaf0574bb8bd7d27482b550b0d5376515cb7..58dfe33ac7208f429a74730027a3a1206056c211 100644 |
--- a/src/type-feedback-vector-inl.h |
+++ b/src/type-feedback-vector-inl.h |
@@ -159,8 +159,6 @@ CompareOperationHint CompareOperationHintFromFeedback(int type_feedback) { |
void TypeFeedbackVector::ComputeCounts(int* with_type_info, int* generic, |
int* vector_ic_count, |
bool code_is_interpreted) { |
- Object* uninitialized_sentinel = |
- TypeFeedbackVector::RawUninitializedSentinel(GetIsolate()); |
Object* megamorphic_sentinel = |
*TypeFeedbackVector::MegamorphicSentinel(GetIsolate()); |
int with = 0; |
@@ -171,47 +169,58 @@ void TypeFeedbackVector::ComputeCounts(int* with_type_info, int* generic, |
FeedbackVectorSlot slot = iter.Next(); |
FeedbackVectorSlotKind kind = iter.kind(); |
- Object* obj = Get(slot); |
- if (kind == FeedbackVectorSlotKind::GENERAL) { |
- continue; |
- } |
- total++; |
- |
- if (obj != uninitialized_sentinel) { |
- 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; |
- |
- 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++; |
+ Object* const obj = Get(slot); |
+ switch (kind) { |
+ case FeedbackVectorSlotKind::CALL_IC: |
+ case FeedbackVectorSlotKind::LOAD_IC: |
+ case FeedbackVectorSlotKind::LOAD_GLOBAL_IC: |
+ case FeedbackVectorSlotKind::KEYED_LOAD_IC: |
+ case FeedbackVectorSlotKind::STORE_IC: |
+ case FeedbackVectorSlotKind::KEYED_STORE_IC: { |
+ if (obj->IsWeakCell() || obj->IsFixedArray() || obj->IsString()) { |
+ with++; |
+ } else if (obj == megamorphic_sentinel) { |
+ gen++; |
+ } |
+ total++; |
+ break; |
+ } |
+ case FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC: |
+ case FeedbackVectorSlotKind::INTERPRETER_COMPARE_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) { |
+ int const feedback = Smi::cast(obj)->value(); |
+ if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC) { |
+ CompareOperationHint hint = |
+ CompareOperationHintFromFeedback(feedback); |
+ if (hint == CompareOperationHint::kAny) { |
+ gen++; |
+ } else if (hint != CompareOperationHint::kNone) { |
+ with++; |
+ } |
+ } else { |
+ DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC, kind); |
+ BinaryOperationHint hint = |
+ BinaryOperationHintFromFeedback(feedback); |
+ if (hint == BinaryOperationHint::kAny) { |
+ gen++; |
+ } else if (hint != BinaryOperationHint::kNone) { |
+ with++; |
+ } |
} |
+ total++; |
} |
- } else if (obj->IsWeakCell() || obj->IsFixedArray() || obj->IsString()) { |
- with++; |
- } else if (obj == megamorphic_sentinel) { |
- gen++; |
+ break; |
} |
+ case FeedbackVectorSlotKind::GENERAL: |
+ break; |
+ case FeedbackVectorSlotKind::INVALID: |
+ case FeedbackVectorSlotKind::KINDS_NUMBER: |
+ UNREACHABLE(); |
+ break; |
} |
} |