Revision: 19893
Author:   [email protected]
Date:     Thu Mar 13 12:17:43 2014 UTC
Log:      Perf regression: changes in KeyedStoreIC introduced polymorphism.

When fixing bug 350884, I introduced an error that meant we went
polymorphic in KeyedStoreIC where we stayed monomorphic before. This
CL addresses the error, while preserving the bug fix for 350884.

[email protected]

Review URL: https://codereview.chromium.org/198793002
http://code.google.com/p/v8/source/detail?r=19893

Modified:
 /branches/bleeding_edge/src/ic.cc

=======================================
--- /branches/bleeding_edge/src/ic.cc   Thu Mar 13 10:57:07 2014 UTC
+++ /branches/bleeding_edge/src/ic.cc   Thu Mar 13 12:17:43 2014 UTC
@@ -1459,22 +1459,22 @@
       KeyedStoreIC::GetKeyedAccessStoreMode(target()->extra_ic_state());
   Handle<Map> previous_receiver_map = target_receiver_maps.at(0);
   if (state() == MONOMORPHIC) {
+    Handle<Map> transitioned_receiver_map = receiver_map;
     if (IsTransitionStoreMode(store_mode)) {
+ transitioned_receiver_map = ComputeTransitionedMap(receiver, store_mode);
+    }
+    if (receiver_map.is_identical_to(previous_receiver_map) ||
+        IsTransitionOfMonomorphicTarget(
+            MapToType<HeapType>(transitioned_receiver_map, isolate()))) {
// If the "old" and "new" maps are in the same elements map family, or // if they at least come from the same origin for a transitioning store, // stay MONOMORPHIC and use the map for the most generic ElementsKind.
-      Handle<Map> transitioned_receiver_map =
-          ComputeTransitionedMap(receiver, store_mode);
-      if (*previous_receiver_map == receiver->map() ||
-          IsTransitionOfMonomorphicTarget(
-              MapToType<HeapType>(transitioned_receiver_map, isolate()))) {
-        store_mode = GetNonTransitioningStoreMode(store_mode);
-        return isolate()->stub_cache()->ComputeKeyedStoreElement(
-            transitioned_receiver_map, strict_mode(), store_mode);
-      }
+      store_mode = GetNonTransitioningStoreMode(store_mode);
+      return isolate()->stub_cache()->ComputeKeyedStoreElement(
+          transitioned_receiver_map, strict_mode(), store_mode);
     } else if (*previous_receiver_map == receiver->map() &&
                old_store_mode == STANDARD_STORE &&
-               (IsGrowStoreMode(store_mode) ||
+               (store_mode == STORE_AND_GROW_NO_TRANSITION ||
                 store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS ||
                 store_mode == STORE_NO_TRANSITION_HANDLE_COW)) {
       // A "normal" IC that handles stores can switch to a version that can

--
--
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.

Reply via email to