Reviewers: ulan,

Message:
PTAL

Description:
Separate MEGAMORPHIC and GENERIC ic states


Please review this at https://chromiumcodereview.appspot.com/11824063/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/builtins.h
  M src/ic.h
  M src/ic.cc
  M src/objects-visiting-inl.h
  M src/objects.cc
  M src/type-info.cc
  M src/v8globals.h


Index: src/builtins.h
diff --git a/src/builtins.h b/src/builtins.h
index 3ca397e63a7a05e96fe7218ae8088e0d47fc5ada..9a02ad0f2cdaceba309d8eaf937bcdb9347712cc 100644
--- a/src/builtins.h
+++ b/src/builtins.h
@@ -151,13 +151,13 @@ enum BuiltinExtraArguments {
                                     Code::kNoExtraICState)              \
   V(KeyedLoadIC_PreMonomorphic,     KEYED_LOAD_IC, PREMONOMORPHIC,      \
                                     Code::kNoExtraICState)              \
-  V(KeyedLoadIC_Generic,            KEYED_LOAD_IC, MEGAMORPHIC,         \
+  V(KeyedLoadIC_Generic,            KEYED_LOAD_IC, GENERIC,             \
                                     Code::kNoExtraICState)              \
-  V(KeyedLoadIC_String,             KEYED_LOAD_IC, MEGAMORPHIC,         \
+  V(KeyedLoadIC_String,             KEYED_LOAD_IC, GENERIC,             \
                                     Code::kNoExtraICState)              \
-  V(KeyedLoadIC_IndexedInterceptor, KEYED_LOAD_IC, MEGAMORPHIC,         \
+  V(KeyedLoadIC_IndexedInterceptor, KEYED_LOAD_IC, GENERIC,             \
                                     Code::kNoExtraICState)              \
-  V(KeyedLoadIC_NonStrictArguments, KEYED_LOAD_IC, MEGAMORPHIC,         \
+  V(KeyedLoadIC_NonStrictArguments, KEYED_LOAD_IC, GENERIC,             \
                                     Code::kNoExtraICState)              \
                                                                         \
   V(StoreIC_Initialize,             STORE_IC, UNINITIALIZED,            \
@@ -168,7 +168,7 @@ enum BuiltinExtraArguments {
                                     Code::kNoExtraICState)              \
   V(StoreIC_Megamorphic,            STORE_IC, MEGAMORPHIC,              \
                                     Code::kNoExtraICState)              \
-  V(StoreIC_GlobalProxy,            STORE_IC, MEGAMORPHIC,              \
+  V(StoreIC_GlobalProxy,            STORE_IC, GENERIC,                  \
                                     Code::kNoExtraICState)              \
   V(StoreIC_Initialize_Strict,      STORE_IC, UNINITIALIZED,            \
                                     kStrictMode)                        \
@@ -178,21 +178,21 @@ enum BuiltinExtraArguments {
                                     kStrictMode)                        \
   V(StoreIC_Megamorphic_Strict,     STORE_IC, MEGAMORPHIC,              \
                                     kStrictMode)                        \
-  V(StoreIC_GlobalProxy_Strict,     STORE_IC, MEGAMORPHIC,              \
+  V(StoreIC_GlobalProxy_Strict,     STORE_IC, GENERIC,                  \
                                     kStrictMode)                        \
   V(StoreIC_Setter_ForDeopt,        STORE_IC, MONOMORPHIC,              \
                                     kStrictMode)                        \
                                                                         \
   V(KeyedStoreIC_Initialize,        KEYED_STORE_IC, UNINITIALIZED,      \
                                     Code::kNoExtraICState)              \
-  V(KeyedStoreIC_Generic,           KEYED_STORE_IC, MEGAMORPHIC,        \
+  V(KeyedStoreIC_Generic,           KEYED_STORE_IC, GENERIC,            \
                                     Code::kNoExtraICState)              \
                                                                         \
   V(KeyedStoreIC_Initialize_Strict, KEYED_STORE_IC, UNINITIALIZED,      \
                                     kStrictMode)                        \
-  V(KeyedStoreIC_Generic_Strict,    KEYED_STORE_IC, MEGAMORPHIC,        \
+  V(KeyedStoreIC_Generic_Strict,    KEYED_STORE_IC, GENERIC,            \
                                     kStrictMode)                        \
-  V(KeyedStoreIC_NonStrictArguments, KEYED_STORE_IC, MEGAMORPHIC,       \
+  V(KeyedStoreIC_NonStrictArguments, KEYED_STORE_IC, GENERIC,           \
                                      Code::kNoExtraICState)             \
   V(TransitionElementsSmiToDouble,  BUILTIN, UNINITIALIZED,             \
                                     Code::kNoExtraICState)              \
Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index ba68bebd52ccec17b17b70767b374ed84b69d530..8237b39cc9ea76579a0c2eb3a8d372e9cd0ab7b4 100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -47,7 +47,8 @@ char IC::TransitionMarkFromState(IC::State state) {
     case MONOMORPHIC: return '1';
     case MONOMORPHIC_PROTOTYPE_FAILURE: return '^';
     case POLYMORPHIC: return 'P';
-    case MEGAMORPHIC: return IsGeneric() ? 'G' : 'N';
+    case MEGAMORPHIC: return 'N';
+    case GENERIC: return 'G';

     // We never see the debugger states here, because the state is
     // computed from the original code - not the patched code. Let
@@ -772,6 +773,7 @@ void CallICBase::UpdateCaches(LookupResult* lookup,
     case DEBUG_STUB:
       break;
     case POLYMORPHIC:
+    case GENERIC:
       UNREACHABLE();
       break;
   }
@@ -795,7 +797,9 @@ MaybeObject* KeyedCallIC::LoadFunction(State state,
     return TypeError("non_object_property_call", object, key);
   }

-  if (FLAG_use_ic && state != MEGAMORPHIC && object->IsHeapObject()) {
+  if (FLAG_use_ic &&
+      (state != MEGAMORPHIC && state != GENERIC) &&
+      object->IsHeapObject()) {
     int argc = target()->arguments_count();
     Handle<Map> map =
         isolate()->factory()->non_strict_arguments_elements_map();
@@ -854,7 +858,7 @@ MaybeObject* LoadIC::Load(State state,
             : isolate()->builtins()->LoadIC_StringWrapperLength();
       } else if (state == MONOMORPHIC && object->IsStringWrapper()) {
         stub = isolate()->builtins()->LoadIC_StringWrapperLength();
-      } else if (state != MEGAMORPHIC) {
+      } else if (state != MEGAMORPHIC && state != GENERIC) {
         stub = megamorphic_stub();
       }
       if (!stub.is_null()) {
@@ -878,7 +882,7 @@ MaybeObject* LoadIC::Load(State state,
         stub = pre_monomorphic_stub();
       } else if (state == PREMONOMORPHIC) {
         stub = isolate()->builtins()->LoadIC_ArrayLength();
-      } else if (state != MEGAMORPHIC) {
+      } else if (state != MEGAMORPHIC && state != GENERIC) {
         stub = megamorphic_stub();
       }
       if (!stub.is_null()) {
@@ -899,7 +903,7 @@ MaybeObject* LoadIC::Load(State state,
         stub = pre_monomorphic_stub();
       } else if (state == PREMONOMORPHIC) {
         stub = isolate()->builtins()->LoadIC_FunctionPrototype();
-      } else if (state != MEGAMORPHIC) {
+      } else if (state != MEGAMORPHIC && state != GENERIC) {
         stub = megamorphic_stub();
       }
       if (!stub.is_null()) {
@@ -1067,6 +1071,7 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
     case DEBUG_STUB:
       break;
     case POLYMORPHIC:
+    case GENERIC:
       UNREACHABLE();
       break;
   }
@@ -1339,6 +1344,7 @@ void KeyedLoadIC::UpdateCaches(LookupResult* lookup,
     case DEBUG_STUB:
       break;
     case MONOMORPHIC_PROTOTYPE_FAILURE:
+    case GENERIC:
       UNREACHABLE();
       break;
   }
@@ -1614,6 +1620,7 @@ void StoreIC::UpdateCaches(LookupResult* lookup,
     case DEBUG_STUB:
       break;
     case POLYMORPHIC:
+    case GENERIC:
       UNREACHABLE();
       break;
   }
@@ -1658,6 +1665,7 @@ void KeyedIC::GetReceiverMapsForStub(Handle<Code> stub,
         break;
       }
       case MEGAMORPHIC:
+      case GENERIC:
         break;
       case UNINITIALIZED:
       case PREMONOMORPHIC:
@@ -2111,6 +2119,7 @@ void KeyedStoreIC::UpdateCaches(LookupResult* lookup,
     case DEBUG_STUB:
       break;
     case MONOMORPHIC_PROTOTYPE_FAILURE:
+    case GENERIC:
       UNREACHABLE();
       break;
   }
@@ -2354,7 +2363,7 @@ UnaryOpIC::State UnaryOpIC::ToState(TypeInfo type_info) {
     case HEAP_NUMBER:
       return MONOMORPHIC;
     case GENERIC:
-      return MEGAMORPHIC;
+      return ::v8::internal::GENERIC;
   }
   UNREACHABLE();
   return ::v8::internal::UNINITIALIZED;
@@ -2425,7 +2434,7 @@ BinaryOpIC::State BinaryOpIC::ToState(TypeInfo type_info) {
     case STRING:
       return MONOMORPHIC;
     case GENERIC:
-      return MEGAMORPHIC;
+      return ::v8::internal::GENERIC;
   }
   UNREACHABLE();
   return ::v8::internal::UNINITIALIZED;
Index: src/ic.h
diff --git a/src/ic.h b/src/ic.h
index dd81ab4b211a6c2a115c27d2abc3c36371f01d3e..0cc6aa461354612ae774a6960537f5e9af465c04 100644
--- a/src/ic.h
+++ b/src/ic.h
@@ -97,8 +97,6 @@ class IC {
   Code* target() const { return GetTargetAtAddress(address()); }
   inline Address address() const;

-  virtual bool IsGeneric() const { return false; }
-
// Compute the current IC state based on the target stub, receiver and name.
   static State StateFrom(Code* target, Object* receiver, Object* name);

@@ -519,10 +517,6 @@ class KeyedLoadIC: public KeyedIC {
       ElementsKind elements_kind,
       KeyedAccessGrowMode grow_mode);

-  virtual bool IsGeneric() const {
-    return target() == *generic_stub();
-  }
-
  protected:
   virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; }

@@ -680,11 +674,6 @@ class KeyedStoreIC: public KeyedIC {
       ElementsKind elements_kind,
       KeyedAccessGrowMode grow_mode);

-  virtual bool IsGeneric() const {
-    return target() == *generic_stub() ||
-        target() == *generic_stub_strict();
-  }
-
  protected:
   virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; }

Index: src/objects-visiting-inl.h
diff --git a/src/objects-visiting-inl.h b/src/objects-visiting-inl.h
index 309cddf66c7b617fd3a0236d4ea47fa19dc5c712..33af4038b6b0aedfd29609f412d7261a287de0db 100644
--- a/src/objects-visiting-inl.h
+++ b/src/objects-visiting-inl.h
@@ -211,7 +211,7 @@ void StaticMarkingVisitor<StaticVisitor>::VisitCodeTarget(
   // when they might be keeping a Context alive, or when the heap is about
   // to be serialized.
   if (FLAG_cleanup_code_caches_at_gc && target->is_inline_cache_stub()
-      && (target->ic_state() == MEGAMORPHIC ||
+ && (target->ic_state() == MEGAMORPHIC || target->ic_state() == GENERIC || target->ic_state() == POLYMORPHIC || heap->flush_monomorphic_ics() || Serializer::enabled() || target->ic_age() != heap->global_ic_age())) {
     IC::Clear(rinfo->pc());
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 1d7ceb06d401b81c858135da9be1dacc3123353f..b5699df22a189fbe71cbd9108b316d9b2f24f2f4 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -9036,6 +9036,7 @@ const char* Code::ICState2String(InlineCacheState state) { case MONOMORPHIC_PROTOTYPE_FAILURE: return "MONOMORPHIC_PROTOTYPE_FAILURE";
     case POLYMORPHIC: return "POLYMORPHIC";
     case MEGAMORPHIC: return "MEGAMORPHIC";
+    case GENERIC: return "GENERIC";
     case DEBUG_STUB: return "DEBUG_STUB";
   }
   UNREACHABLE();
Index: src/type-info.cc
diff --git a/src/type-info.cc b/src/type-info.cc
index 00e8ee85f7c139fb826115e6848083c70128af9d..75e915bb846d9b0e8c57f8c29102c2c7526c939f 100644
--- a/src/type-info.cc
+++ b/src/type-info.cc
@@ -488,7 +488,7 @@ void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id,
       isolate_->builtins()->builtin(Builtins::kStoreIC_GlobalProxy)) {
     // TODO(fschneider): We could collect the maps and signal that
     // we need a generic store (or load) here.
-    ASSERT(Handle<Code>::cast(object)->ic_state() == MEGAMORPHIC);
+    ASSERT(Handle<Code>::cast(object)->ic_state() == GENERIC);
   } else if (object->IsMap()) {
     types->Add(Handle<Map>::cast(object), zone());
   } else if (FLAG_collect_megamorphic_maps_from_stub_cache &&
Index: src/v8globals.h
diff --git a/src/v8globals.h b/src/v8globals.h
index 807be30df1b2a8abd131ad36633130a849e4299b..65e845571ac62e9108a14980526b6483f00e71be 100644
--- a/src/v8globals.h
+++ b/src/v8globals.h
@@ -263,6 +263,8 @@ enum InlineCacheState {
   POLYMORPHIC,
   // Many receiver types have been seen.
   MEGAMORPHIC,
+  // A generic handler is installed and no extra typefeedback is recorded.
+  GENERIC,
   // Special state for debug break or step in prepare stubs.
   DEBUG_STUB
 };


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to