Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(377)

Unified Diff: src/ic.cc

Issue 445943002: CallIC must update type feedback info correctly. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index bd8db3e01af8bda046cff075238be2c522597304..ec91d978631f32740014cce8f89da625e8c78246 100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -376,11 +376,11 @@ void IC::PostPatching(Address address, Code* target, Code* old_target) {
inner_pointer_to_code_cache()->GetCacheEntry(address)->code;
if (host->kind() != Code::FUNCTION) return;
+ // Type vector based ICs update these statistics differently.
+ if (target->kind() == Code::CALL_IC) 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 &&
// Not all Code objects have TypeFeedbackInfo.
host->type_feedback_info()->IsTypeFeedbackInfo()) {
int polymorphic_delta = 0; // "Polymorphic" here includes monomorphic.
@@ -1920,6 +1920,8 @@ bool CallIC::DoCustomHandler(Handle<Object> receiver,
}
TRACE_IC("CallIC (Array call)", name);
+ Object* new_feedback = vector->get(slot->value());
+ UpdateTypeFeedbackInfo(feedback, new_feedback);
return true;
}
return false;
@@ -1943,6 +1945,49 @@ void CallIC::PatchMegamorphic(Handle<FixedArray> vector,
}
+IC::State CallIC::FeedbackObjectToState(Object* feedback) {
+ 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;
+}
+
+
+void CallIC::UpdateTypeFeedbackInfo(Object* old_feedback, Object* new_feedback) {
Jakob Kummerow 2014/08/06 14:49:09 nit: 80col
mvstanton 2014/08/06 15:32:33 Done.
+ // Convert old_feedback to an IC_State enum:
Jakob Kummerow 2014/08/06 14:49:09 This comment seems to belong to line 1971, but I d
mvstanton 2014/08/06 15:32:33 Done.
+ Code* host = isolate()->
Jakob Kummerow 2014/08/06 14:49:09 Idea for reducing code duplication: pull out most
mvstanton 2014/08/06 15:32:33 Excellent idea, done. I think the cost of computin
+ inner_pointer_to_code_cache()->GetCacheEntry(address())->code;
+ if (host->kind() != Code::FUNCTION) return;
+
+ if (FLAG_type_info_threshold > 0 &&
+ host->type_feedback_info()->IsTypeFeedbackInfo()) {
+ IC::State old_state = FeedbackObjectToState(old_feedback);
+ IC::State new_state = FeedbackObjectToState(new_feedback);
+ int polymorphic_delta = 0; // "Polymorphic" here includes monomorphic.
+ int generic_delta = 0; // "Generic" here includes megamorphic.
+ 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);
+ }
+ if (host->type_feedback_info()->IsTypeFeedbackInfo()) {
+ TypeFeedbackInfo* info =
+ TypeFeedbackInfo::cast(host->type_feedback_info());
+ info->change_own_type_change_checksum();
+ }
+ host->set_profiler_ticks(0);
+ isolate()->runtime_profiler()->NotifyICChanged();
+}
+
+
void CallIC::HandleMiss(Handle<Object> receiver,
Handle<Object> function,
Handle<FixedArray> vector,
@@ -1981,6 +2026,9 @@ void CallIC::HandleMiss(Handle<Object> receiver,
TRACE_IC("CallIC", name);
vector->set(slot->value(), *function);
}
+
+ Object* new_feedback = vector->get(slot->value());
+ UpdateTypeFeedbackInfo(feedback, new_feedback);
}

Powered by Google App Engine
This is Rietveld 408576698