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

Reply via email to