Reviewers: Jakob,
Description:
Optimize call sites that only ever see a single elements transition
[email protected]
TEST=imaging-gaussian-blur performance improves
Please review this at https://chromiumcodereview.appspot.com/9389001/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/ic.cc
Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index
248f4fc891d16430d602c613c81deb21badbaf86..85d6878422cc476c2f9b936329acd4a8ef325c2e
100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -1500,14 +1500,37 @@ Handle<Code> KeyedIC::ComputeStub(Handle<JSObject>
receiver,
StrictModeFlag strict_mode,
Handle<Code> generic_stub) {
State ic_state = target()->ic_state();
+
KeyedAccessGrowMode grow_mode = IsGrowStubKind(stub_kind)
? ALLOW_JSARRAY_GROWTH
: DO_NOT_ALLOW_JSARRAY_GROWTH;
- if ((ic_state == UNINITIALIZED || ic_state == PREMONOMORPHIC) &&
- !IsTransitionStubKind(stub_kind)) {
+
+ bool monomorphic = false;
+ MapHandleList target_receiver_maps;
+ if (!IsTransitionStubKind(stub_kind)) {
+ if (ic_state == UNINITIALIZED || ic_state == PREMONOMORPHIC) {
+ monomorphic = true;
+ } else {
+ GetReceiverMapsForStub(Handle<Code>(target()),
&target_receiver_maps);
+ if (ic_state == MONOMORPHIC) {
+ // The first time there's an element transition, assume the new
+ // ElementsKind is the monomorphic type. This benefits global
arrays
+ // that only transition once, and all call sites accessing them are
+ // faster if they remain monomorphic. If this optimistic
assumption is
+ // not true, the IC will miss again and it will become polymorphic
and
+ // support both the untransitioned and transition maps.
+ monomorphic = IsMoreGeneralElementsKindTransition(
+ target_receiver_maps.at(0)->elements_kind(),
+ receiver->GetElementsKind());
+ }
+ }
+ }
+
+ if (monomorphic) {
return ComputeMonomorphicStub(
receiver, stub_kind, strict_mode, generic_stub);
}
+
ASSERT(target() != *generic_stub);
// Don't handle megamorphic property accesses for INTERCEPTORS or
CALLBACKS
@@ -1520,13 +1543,11 @@ Handle<Code> KeyedIC::ComputeStub(Handle<JSObject>
receiver,
// Determine the list of receiver maps that this call site has seen,
// adding the map that was just encountered.
- MapHandleList target_receiver_maps;
Handle<Map> receiver_map(receiver->map());
if (ic_state == UNINITIALIZED || ic_state == PREMONOMORPHIC) {
target_receiver_maps.Add(receiver_map);
- } else {
- GetReceiverMapsForStub(Handle<Code>(target()), &target_receiver_maps);
}
+
bool map_added =
AddOneReceiverMapIfMissing(&target_receiver_maps, receiver_map);
if (IsTransitionStubKind(stub_kind)) {
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev