Revision: 22962
Author: [email protected]
Date: Thu Aug 7 08:52:00 2014 UTC
Log: CallIC must update type feedback info correctly.
CallIC, as the first of vector-based ICs didn't update the ic with type
count counter and the generic count counter correctly. This CL fixes
that.
BUG=
[email protected]
Review URL: https://codereview.chromium.org/445943002
http://code.google.com/p/v8/source/detail?r=22962
Modified:
/branches/bleeding_edge/src/ic-inl.h
/branches/bleeding_edge/src/ic.cc
/branches/bleeding_edge/src/ic.h
=======================================
--- /branches/bleeding_edge/src/ic-inl.h Mon Aug 4 11:34:54 2014 UTC
+++ /branches/bleeding_edge/src/ic-inl.h Thu Aug 7 08:52:00 2014 UTC
@@ -168,6 +168,20 @@
return TypeToMap(type, isolate);
}
+
+IC::State CallIC::FeedbackObjectToState(Object* feedback) const {
+ IC::State state = UNINITIALIZED;
+
+ if (feedback == *TypeFeedbackInfo::MegamorphicSentinel(isolate())) {
+ state = GENERIC;
+ } else if (feedback->IsAllocationSite() || feedback->IsJSFunction()) {
+ state = MONOMORPHIC;
+ } else {
+ CHECK(feedback == *TypeFeedbackInfo::UninitializedSentinel(isolate()));
+ }
+
+ return state;
+}
} } // namespace v8::internal
#endif // V8_IC_INL_H_
=======================================
--- /branches/bleeding_edge/src/ic.cc Wed Aug 6 15:05:28 2014 UTC
+++ /branches/bleeding_edge/src/ic.cc Thu Aug 7 08:52:00 2014 UTC
@@ -370,23 +370,20 @@
}
-void IC::PostPatching(Address address, Code* target, Code* old_target) {
- Isolate* isolate = target->GetHeap()->isolate();
+void IC::OnTypeFeedbackChanged(Isolate* isolate, Address address,
+ State old_state, State new_state,
+ bool target_remains_ic_stub) {
Code* host = isolate->
inner_pointer_to_code_cache()->GetCacheEntry(address)->code;
if (host->kind() != Code::FUNCTION) return;
- if (FLAG_type_info_threshold > 0 && old_target->is_inline_cache_stub() &&
- target->is_inline_cache_stub() &&
- // Call ICs don't have interesting state changes from this point
- // of view.
- target->kind() != Code::CALL_IC &&
+ if (FLAG_type_info_threshold > 0 && target_remains_ic_stub &&
// Not all Code objects have TypeFeedbackInfo.
host->type_feedback_info()->IsTypeFeedbackInfo()) {
int polymorphic_delta = 0; // "Polymorphic" here includes monomorphic.
int generic_delta = 0; // "Generic" here includes megamorphic.
- ComputeTypeInfoCountDelta(old_target->ic_state(), target->ic_state(),
- &polymorphic_delta, &generic_delta);
+ ComputeTypeInfoCountDelta(old_state, new_state, &polymorphic_delta,
+ &generic_delta);
TypeFeedbackInfo* info =
TypeFeedbackInfo::cast(host->type_feedback_info());
info->change_ic_with_type_info_count(polymorphic_delta);
info->change_ic_generic_count(generic_delta);
@@ -403,6 +400,26 @@
// unoptimized version for the benefit of later inlining.
}
+
+void IC::PostPatching(Address address, Code* target, Code* old_target) {
+ // Type vector based ICs update these statistics at a different time
because
+ // they don't always patch on state change.
+ if (target->kind() == Code::CALL_IC) return;
+
+ Isolate* isolate = target->GetHeap()->isolate();
+ State old_state = UNINITIALIZED;
+ State new_state = UNINITIALIZED;
+ bool target_remains_ic_stub = false;
+ if (old_target->is_inline_cache_stub() &&
target->is_inline_cache_stub()) {
+ old_state = old_target->ic_state();
+ new_state = target->ic_state();
+ target_remains_ic_stub = true;
+ }
+
+ OnTypeFeedbackChanged(isolate, address, old_state, new_state,
+ target_remains_ic_stub);
+}
+
void IC::RegisterWeakMapDependency(Handle<Code> stub) {
if (FLAG_collect_maps && FLAG_weak_embedded_maps_in_ic &&
@@ -1949,6 +1966,8 @@
}
TRACE_IC("CallIC (Array call)", name);
+ Object* new_feedback = vector->get(slot->value());
+ UpdateTypeFeedbackInfo(feedback, new_feedback);
return true;
}
return false;
@@ -1970,6 +1989,14 @@
TRACE_GENERIC_IC(isolate(), "CallIC", "megamorphic");
}
+
+
+void CallIC::UpdateTypeFeedbackInfo(Object* old_feedback,
+ Object* new_feedback) {
+ IC::State old_state = FeedbackObjectToState(old_feedback);
+ IC::State new_state = FeedbackObjectToState(new_feedback);
+ OnTypeFeedbackChanged(isolate(), address(), old_state, new_state, true);
+}
void CallIC::HandleMiss(Handle<Object> receiver,
@@ -2010,6 +2037,9 @@
TRACE_IC("CallIC", name);
vector->set(slot->value(), *function);
}
+
+ Object* new_feedback = vector->get(slot->value());
+ UpdateTypeFeedbackInfo(feedback, new_feedback);
}
=======================================
--- /branches/bleeding_edge/src/ic.h Mon Aug 4 11:34:54 2014 UTC
+++ /branches/bleeding_edge/src/ic.h Thu Aug 7 08:52:00 2014 UTC
@@ -175,6 +175,9 @@
static inline void SetTargetAtAddress(Address address,
Code* target,
ConstantPoolArray* constant_pool);
+ static void OnTypeFeedbackChanged(Isolate* isolate, Address address,
+ State old_state, State new_state,
+ bool target_remains_ic_stub);
static void PostPatching(Address address, Code* target, Code*
old_target);
// Compute the handler either by compiling or by retrieving a cached
version.
@@ -377,6 +380,10 @@
static void Clear(Isolate* isolate, Address address, Code* target,
ConstantPoolArray* constant_pool);
+
+ private:
+ void UpdateTypeFeedbackInfo(Object* old_feedback, Object* new_feedback);
+ inline IC::State FeedbackObjectToState(Object* feedback) const;
};
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.