Reviewers: Jakob,
Message:
PTAL
Description:
Only generate a single normal IC per kind per slow-mode map.
BUG=
Please review this at https://codereview.chromium.org/429543004/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+54, -42 lines):
M include/v8.h
M src/arm/stub-cache-arm.cc
M src/arm64/stub-cache-arm64.cc
M src/heap.h
M src/heap.cc
M src/ia32/stub-cache-ia32.cc
M src/ic.cc
M src/stub-cache.cc
M src/x64/stub-cache-x64.cc
Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index
9cfeed0fd4365e31b3cb0b1e1aa8a9a8c2f18a87..8cfeacdee03aa803b456e8db6fa424c07c9bac74
100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -5648,7 +5648,7 @@ class Internals {
static const int kNullValueRootIndex = 7;
static const int kTrueValueRootIndex = 8;
static const int kFalseValueRootIndex = 9;
- static const int kEmptyStringRootIndex = 163;
+ static const int kEmptyStringRootIndex = 164;
// The external allocation limit should be below 256 MB on all
architectures
// to avoid that resource-constrained embedders run low on memory.
Index: src/arm/stub-cache-arm.cc
diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc
index
b2b1a928097210184c438683c44ee6d1448cbdd2..dae07863fdaa900d323f3c4d3980f4406c8c4428
100644
--- a/src/arm/stub-cache-arm.cc
+++ b/src/arm/stub-cache-arm.cc
@@ -1273,8 +1273,12 @@ Handle<Code>
PropertyICCompiler::CompilePolymorphic(TypeHandleList* types,
if (check == PROPERTY &&
(kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
- __ cmp(this->name(), Operand(name));
- __ b(ne, &miss);
+ if (name.is_identical_to(isolate()->factory()->normal_ic_symbol())) {
+ __ JumpIfNotUniqueName(this->name(), &miss);
+ } else {
+ __ cmp(this->name(), Operand(name));
+ __ b(ne, &miss);
+ }
}
Label number_case;
Index: src/arm64/stub-cache-arm64.cc
diff --git a/src/arm64/stub-cache-arm64.cc b/src/arm64/stub-cache-arm64.cc
index
703cd5d4afcc85da1929c2b94ecca4362cd25aeb..51c6ade4fd1fa2bb3d56a9a1a24ce72b0cbcb816
100644
--- a/src/arm64/stub-cache-arm64.cc
+++ b/src/arm64/stub-cache-arm64.cc
@@ -1241,7 +1241,11 @@ Handle<Code>
PropertyICCompiler::CompilePolymorphic(TypeHandleList* types,
if (check == PROPERTY &&
(kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
- __ CompareAndBranch(this->name(), Operand(name), ne, &miss);
+ if (name.is_identical_to(isolate()->factory()->normal_ic_symbol())) {
+ __ JumpIfNotUniqueName(this->name(), &miss);
+ } else {
+ __ CompareAndBranch(this->name(), Operand(name), ne, &miss);
+ }
}
Label number_case;
Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index
e7012312d9ae35fd14499f6140c01f3a61d64d0d..67ee043e0b1168d49e5fef8914fc9535cc575600
100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -2924,14 +2924,15 @@ void Heap::CreateInitialObjects() {
// Number of queued microtasks stored in
Isolate::pending_microtask_count().
set_microtask_queue(empty_fixed_array());
- set_frozen_symbol(*factory->NewPrivateSymbol());
- set_nonexistent_symbol(*factory->NewPrivateSymbol());
+ set_detailed_stack_trace_symbol(*factory->NewPrivateSymbol());
set_elements_transition_symbol(*factory->NewPrivateSymbol());
- set_uninitialized_symbol(*factory->NewPrivateSymbol());
+ set_frozen_symbol(*factory->NewPrivateSymbol());
set_megamorphic_symbol(*factory->NewPrivateSymbol());
+ set_nonexistent_symbol(*factory->NewPrivateSymbol());
+ set_normal_ic_symbol(*factory->NewPrivateSymbol());
set_observed_symbol(*factory->NewPrivateSymbol());
set_stack_trace_symbol(*factory->NewPrivateSymbol());
- set_detailed_stack_trace_symbol(*factory->NewPrivateSymbol());
+ set_uninitialized_symbol(*factory->NewPrivateSymbol());
Handle<SeededNumberDictionary> slow_element_dictionary =
SeededNumberDictionary::New(isolate(), 0, TENURED);
Index: src/heap.h
diff --git a/src/heap.h b/src/heap.h
index
5bb6552ffc87fc6e4a61b0fb35f059528e430c30..587b67bdf064c771de14f9b08bb9d839773c5b56
100644
--- a/src/heap.h
+++ b/src/heap.h
@@ -79,33 +79,24 @@ namespace internal {
V(Map, sliced_string_map,
SlicedStringMap) \
V(Map, sliced_ascii_string_map,
SlicedAsciiStringMap) \
V(Map, external_string_map,
ExternalStringMap) \
-
V(Map,
\
-
external_string_with_one_byte_data_map, \
+ V(Map,
external_string_with_one_byte_data_map, \
ExternalStringWithOneByteDataMap) \
V(Map, external_ascii_string_map,
ExternalAsciiStringMap) \
V(Map, short_external_string_map,
ShortExternalStringMap) \
-
V(Map,
\
-
short_external_string_with_one_byte_data_map, \
+ V(Map,
short_external_string_with_one_byte_data_map, \
ShortExternalStringWithOneByteDataMap) \
V(Map, internalized_string_map,
InternalizedStringMap) \
V(Map, ascii_internalized_string_map,
AsciiInternalizedStringMap) \
-
V(Map,
\
-
external_internalized_string_map, \
-
ExternalInternalizedStringMap) \
-
V(Map,
\
-
external_internalized_string_with_one_byte_data_map, \
+ V(Map, external_internalized_string_map,
ExternalInternalizedStringMap) \
+ V(Map,
external_internalized_string_with_one_byte_data_map, \
ExternalInternalizedStringWithOneByteDataMap) \
-
V(Map,
\
-
external_ascii_internalized_string_map, \
+ V(Map,
external_ascii_internalized_string_map, \
ExternalAsciiInternalizedStringMap) \
-
V(Map,
\
-
short_external_internalized_string_map, \
+ V(Map,
short_external_internalized_string_map, \
ShortExternalInternalizedStringMap) \
-
V(Map,
\
-
short_external_internalized_string_with_one_byte_data_map, \
+ V(Map,
short_external_internalized_string_with_one_byte_data_map, \
ShortExternalInternalizedStringWithOneByteDataMap) \
-
V(Map,
\
-
short_external_ascii_internalized_string_map, \
+ V(Map,
short_external_ascii_internalized_string_map, \
ShortExternalAsciiInternalizedStringMap) \
V(Map, short_external_ascii_string_map,
ShortExternalAsciiStringMap) \
V(Map, undetectable_string_map,
UndetectableStringMap) \
@@ -119,20 +110,16 @@ namespace internal {
V(Map, external_float32_array_map,
ExternalFloat32ArrayMap) \
V(Map, external_float64_array_map,
ExternalFloat64ArrayMap) \
V(Map, external_uint8_clamped_array_map,
ExternalUint8ClampedArrayMap) \
- V(ExternalArray,
empty_external_int8_array, \
-
EmptyExternalInt8Array) \
- V(ExternalArray,
empty_external_uint8_array, \
-
EmptyExternalUint8Array) \
+ V(ExternalArray, empty_external_int8_array,
EmptyExternalInt8Array) \
+ V(ExternalArray, empty_external_uint8_array,
EmptyExternalUint8Array) \
V(ExternalArray, empty_external_int16_array,
EmptyExternalInt16Array) \
- V(ExternalArray,
empty_external_uint16_array, \
-
EmptyExternalUint16Array) \
+ V(ExternalArray, empty_external_uint16_array,
EmptyExternalUint16Array) \
V(ExternalArray, empty_external_int32_array,
EmptyExternalInt32Array) \
- V(ExternalArray,
empty_external_uint32_array, \
-
EmptyExternalUint32Array) \
+ V(ExternalArray, empty_external_uint32_array,
EmptyExternalUint32Array) \
V(ExternalArray, empty_external_float32_array,
EmptyExternalFloat32Array) \
V(ExternalArray, empty_external_float64_array,
EmptyExternalFloat64Array) \
V(ExternalArray,
empty_external_uint8_clamped_array, \
-
EmptyExternalUint8ClampedArray) \
+
EmptyExternalUint8ClampedArray) \
V(Map, fixed_uint8_array_map,
FixedUint8ArrayMap) \
V(Map, fixed_int8_array_map,
FixedInt8ArrayMap) \
V(Map, fixed_uint16_array_map,
FixedUint16ArrayMap) \
@@ -151,7 +138,7 @@ namespace internal {
V(FixedTypedArrayBase, empty_fixed_float32_array,
EmptyFixedFloat32Array) \
V(FixedTypedArrayBase, empty_fixed_float64_array,
EmptyFixedFloat64Array) \
V(FixedTypedArrayBase,
empty_fixed_uint8_clamped_array, \
-
EmptyFixedUint8ClampedArray) \
+
EmptyFixedUint8ClampedArray) \
V(Map, sloppy_arguments_elements_map,
SloppyArgumentsElementsMap) \
V(Map, function_context_map,
FunctionContextMap) \
V(Map, catch_context_map,
CatchContextMap) \
@@ -191,12 +178,13 @@ namespace internal {
V(Symbol, nonexistent_symbol,
NonExistentSymbol) \
V(Symbol, elements_transition_symbol,
ElementsTransitionSymbol) \
V(SeededNumberDictionary,
empty_slow_element_dictionary, \
-
EmptySlowElementDictionary) \
+
EmptySlowElementDictionary) \
V(Symbol, observed_symbol,
ObservedSymbol) \
V(Symbol, uninitialized_symbol,
UninitializedSymbol) \
V(Symbol, megamorphic_symbol,
MegamorphicSymbol) \
V(Symbol, stack_trace_symbol,
StackTraceSymbol) \
V(Symbol, detailed_stack_trace_symbol,
DetailedStackTraceSymbol) \
+ V(Symbol, normal_ic_symbol,
NormalICSymbol) \
V(FixedArray, materialized_objects,
MaterializedObjects) \
V(FixedArray, allocation_sites_scratchpad,
AllocationSitesScratchpad) \
V(FixedArray, microtask_queue, MicrotaskQueue)
Index: src/ia32/stub-cache-ia32.cc
diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc
index
55376071472930e2f51e39b51f309e30f9851319..8192ece896a39c34530444d7b08f767d5350d691
100644
--- a/src/ia32/stub-cache-ia32.cc
+++ b/src/ia32/stub-cache-ia32.cc
@@ -1300,8 +1300,14 @@ Handle<Code>
PropertyICCompiler::CompilePolymorphic(TypeHandleList* types,
if (check == PROPERTY &&
(kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
- __ cmp(this->name(), Immediate(name));
- __ j(not_equal, &miss);
+ // In case we are compiling an IC for dictionary loads and stores, just
+ // check whether the name is unique.
+ if (name.is_identical_to(isolate()->factory()->normal_ic_symbol())) {
+ __ JumpIfNotUniqueName(this->name(), &miss);
+ } else {
+ __ cmp(this->name(), Immediate(name));
+ __ j(not_equal, &miss);
+ }
}
Label number_case;
Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index
23cae194a2112f116329daa13df237df731e3888..c11f58244e05b2299d61280f5fa0044d98a6c8ff
100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -724,7 +724,7 @@ Handle<HeapType> IC::MapToType<HeapType>(Handle<Map>
map, Isolate* region);
void IC::UpdateMonomorphicIC(Handle<Code> handler, Handle<String> name) {
- if (!handler->is_handler()) return set_target(*handler);
+ ASSERT(handler->is_handler());
Handle<Code> ic = PropertyICCompiler::ComputeMonomorphic(
kind(), name, receiver_type(), handler, extra_ic_state());
set_target(*ic);
Index: src/stub-cache.cc
diff --git a/src/stub-cache.cc b/src/stub-cache.cc
index
78a217bb61a06b124ab19d511fd9657f2c27acc0..eb7195213a9710fe677ce34dcceb107cae249695
100644
--- a/src/stub-cache.cc
+++ b/src/stub-cache.cc
@@ -132,8 +132,13 @@ Handle<Code>
PropertyHandlerCompiler::Find(Handle<Name> name,
Handle<Code> PropertyICCompiler::ComputeMonomorphic(
Code::Kind kind, Handle<Name> name, Handle<HeapType> type,
Handle<Code> handler, ExtraICState extra_ic_state) {
- CacheHolderFlag flag;
Isolate* isolate = name->GetIsolate();
+ if (handler.is_identical_to(isolate->builtins()->LoadIC_Normal()) ||
+ handler.is_identical_to(isolate->builtins()->StoreIC_Normal())) {
+ name = isolate->factory()->normal_ic_symbol();
+ }
+
+ CacheHolderFlag flag;
Handle<Map> stub_holder = IC::GetICCacheHolder(*type, isolate, &flag);
Handle<Code> ic;
Index: src/x64/stub-cache-x64.cc
diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc
index
93173f162bd3a4811ca0a8e3bc34950034077732..a7ed3b29b7a2c047999cd34e5888b9f2a172a28b
100644
--- a/src/x64/stub-cache-x64.cc
+++ b/src/x64/stub-cache-x64.cc
@@ -1234,8 +1234,12 @@ Handle<Code>
PropertyICCompiler::CompilePolymorphic(TypeHandleList* types,
if (check == PROPERTY &&
(kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
- __ Cmp(this->name(), name);
- __ j(not_equal, &miss);
+ if (name.is_identical_to(isolate()->factory()->normal_ic_symbol())) {
+ __ JumpIfNotUniqueName(this->name(), &miss);
+ } else {
+ __ Cmp(this->name(), name);
+ __ j(not_equal, &miss);
+ }
}
Label number_case;
--
--
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.