Revision: 4853
Author: [email protected]
Date: Mon Jun 14 03:10:42 2010
Log: Only update the stub cache tables with monomorphic stubs used by
megamorphic call sites. This removes a lot of contention in the
tables.
Review URL: http://codereview.chromium.org/2813002
http://code.google.com/p/v8/source/detail?r=4853
Modified:
/branches/bleeding_edge/src/ic.cc
/branches/bleeding_edge/src/stub-cache.cc
=======================================
--- /branches/bleeding_edge/src/ic.cc Wed Jun 9 22:06:39 2010
+++ /branches/bleeding_edge/src/ic.cc Mon Jun 14 03:10:42 2010
@@ -386,6 +386,7 @@
return *delegate;
}
+
void CallICBase::ReceiverToObject(Handle<Object> object) {
HandleScope scope;
@@ -588,6 +589,9 @@
state == MONOMORPHIC ||
state == MONOMORPHIC_PROTOTYPE_FAILURE) {
set_target(Code::cast(code));
+ } else if (state == MEGAMORPHIC) {
+ // Update the stub cache.
+ StubCache::Set(*name, GetCodeCacheMapForObject(*object),
Code::cast(code));
}
#ifdef DEBUG
@@ -664,7 +668,6 @@
Code* target = NULL;
target = Builtins::builtin(Builtins::LoadIC_StringLength);
set_target(target);
- StubCache::Set(*name, map, target);
return Smi::FromInt(String::cast(*object)->length());
}
@@ -679,7 +682,6 @@
Code* target = Builtins::builtin(Builtins::LoadIC_ArrayLength);
set_target(target);
- StubCache::Set(*name, map, target);
return JSArray::cast(*object)->length();
}
@@ -691,7 +693,6 @@
#endif
Code* target = Builtins::builtin(Builtins::LoadIC_FunctionPrototype);
set_target(target);
- StubCache::Set(*name, HeapObject::cast(*object)->map(), target);
return Accessors::FunctionGetPrototype(*object, 0);
}
}
@@ -847,6 +848,9 @@
set_target(Code::cast(code));
} else if (state == MONOMORPHIC) {
set_target(megamorphic_stub());
+ } else if (state == MEGAMORPHIC) {
+ // Update the stub cache.
+ StubCache::Set(*name, GetCodeCacheMapForObject(*object),
Code::cast(code));
}
#ifdef DEBUG
@@ -1109,7 +1113,6 @@
if (result.is_null()) return Failure::Exception();
return *value;
}
-
// Use specialized code for setting the length of arrays.
if (receiver->IsJSArray()
@@ -1120,7 +1123,6 @@
#endif
Code* target = Builtins::builtin(Builtins::StoreIC_ArrayLength);
set_target(target);
- StubCache::Set(*name, HeapObject::cast(*object)->map(), target);
return receiver->SetProperty(*name, *value, NONE);
}
@@ -1208,8 +1210,11 @@
if (state == UNINITIALIZED || state == MONOMORPHIC_PROTOTYPE_FAILURE) {
set_target(Code::cast(code));
} else if (state == MONOMORPHIC) {
- // Only move to mega morphic if the target changes.
+ // Only move to megamorphic if the target changes.
if (target() != Code::cast(code)) set_target(megamorphic_stub());
+ } else if (state == MEGAMORPHIC) {
+ // Update the stub cache.
+ StubCache::Set(*name, receiver->map(), Code::cast(code));
}
#ifdef DEBUG
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc Mon Jun 7 01:27:32 2010
+++ /branches/bleeding_edge/src/stub-cache.cc Mon Jun 14 03:10:42 2010
@@ -121,7 +121,7 @@
receiver->map()->UpdateCodeCache(cache_name, Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -139,7 +139,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -158,7 +158,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -177,7 +177,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -194,13 +194,12 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
Object* StubCache::ComputeLoadNormal(String* name, JSObject* receiver) {
- Code* code = Builtins::builtin(Builtins::LoadIC_Normal);
- return Set(name, receiver->map(), code);
+ return Builtins::builtin(Builtins::LoadIC_Normal);
}
@@ -223,7 +222,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -368,7 +367,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -385,7 +384,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -403,7 +402,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -420,7 +419,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -486,7 +485,7 @@
Object* result = map->UpdateCodeCache(name, Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, map, Code::cast(code));
+ return code;
}
@@ -525,7 +524,7 @@
Object* result = map->UpdateCodeCache(name, Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, map, Code::cast(code));
+ return code;
}
@@ -563,7 +562,7 @@
Object* result = map->UpdateCodeCache(name, Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, map, Code::cast(code));
+ return code;
}
@@ -574,7 +573,7 @@
JSObject* receiver) {
Object* code = ComputeCallNormal(argc, in_loop, kind);
if (code->IsFailure()) return code;
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
@@ -607,7 +606,7 @@
Object* result = receiver->map()->UpdateCodeCache(name,
Code::cast(code));
if (result->IsFailure()) return result;
}
- return Set(name, receiver->map(), Code::cast(code));
+ return code;
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev