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