Revision: 22680
Author: [email protected]
Date: Tue Jul 29 17:02:52 2014 UTC
Log: Only generate a single normal IC per kind per slow-mode map.
BUG=
[email protected]
Review URL: https://codereview.chromium.org/429543004
http://code.google.com/p/v8/source/detail?r=22680
Modified:
/branches/bleeding_edge/include/v8.h
/branches/bleeding_edge/src/arm/stub-cache-arm.cc
/branches/bleeding_edge/src/arm64/stub-cache-arm64.cc
/branches/bleeding_edge/src/heap.cc
/branches/bleeding_edge/src/heap.h
/branches/bleeding_edge/src/ia32/stub-cache-ia32.cc
/branches/bleeding_edge/src/ic.cc
/branches/bleeding_edge/src/stub-cache.cc
/branches/bleeding_edge/src/x64/stub-cache-x64.cc
=======================================
--- /branches/bleeding_edge/include/v8.h Fri Jul 25 18:32:11 2014 UTC
+++ /branches/bleeding_edge/include/v8.h Tue Jul 29 17:02:52 2014 UTC
@@ -5648,7 +5648,7 @@
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.
=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue Jul 29 16:07:34
2014 UTC
+++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue Jul 29 17:02:52
2014 UTC
@@ -1273,8 +1273,14 @@
if (check == PROPERTY &&
(kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
- __ cmp(this->name(), Operand(name));
- __ b(ne, &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(), Operand(name));
+ __ b(ne, &miss);
+ }
}
Label number_case;
=======================================
--- /branches/bleeding_edge/src/arm64/stub-cache-arm64.cc Tue Jul 29
16:07:34 2014 UTC
+++ /branches/bleeding_edge/src/arm64/stub-cache-arm64.cc Tue Jul 29
17:02:52 2014 UTC
@@ -1241,7 +1241,13 @@
if (check == PROPERTY &&
(kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
- __ CompareAndBranch(this->name(), Operand(name), ne, &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 {
+ __ CompareAndBranch(this->name(), Operand(name), ne, &miss);
+ }
}
Label number_case;
=======================================
--- /branches/bleeding_edge/src/heap.cc Mon Jul 28 14:18:40 2014 UTC
+++ /branches/bleeding_edge/src/heap.cc Tue Jul 29 17:02:52 2014 UTC
@@ -2924,14 +2924,15 @@
// Number of queued microtasks stored in
Isolate::pending_microtask_count().
set_microtask_queue(empty_fixed_array());
+ set_detailed_stack_trace_symbol(*factory->NewPrivateSymbol());
+ set_elements_transition_symbol(*factory->NewPrivateSymbol());
set_frozen_symbol(*factory->NewPrivateSymbol());
+ set_megamorphic_symbol(*factory->NewPrivateSymbol());
set_nonexistent_symbol(*factory->NewPrivateSymbol());
- set_elements_transition_symbol(*factory->NewPrivateSymbol());
- set_uninitialized_symbol(*factory->NewPrivateSymbol());
- set_megamorphic_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);
=======================================
--- /branches/bleeding_edge/src/heap.h Tue Jul 29 16:07:34 2014 UTC
+++ /branches/bleeding_edge/src/heap.h Tue Jul 29 17:02:52 2014 UTC
@@ -79,33 +79,24 @@
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 @@
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 @@
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 @@
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)
=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Tue Jul 29 16:07:34
2014 UTC
+++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Tue Jul 29 17:02:52
2014 UTC
@@ -1300,8 +1300,14 @@
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;
=======================================
--- /branches/bleeding_edge/src/ic.cc Tue Jul 29 16:07:34 2014 UTC
+++ /branches/bleeding_edge/src/ic.cc Tue Jul 29 17:02:52 2014 UTC
@@ -724,7 +724,7 @@
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);
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc Tue Jul 29 16:07:34 2014 UTC
+++ /branches/bleeding_edge/src/stub-cache.cc Tue Jul 29 17:02:52 2014 UTC
@@ -132,8 +132,13 @@
Handle<Code> PropertyICCompiler::ComputeMonomorphic(
Code::Kind kind, Handle<Name> name, Handle<HeapType> type,
Handle<Code> handler, ExtraICState extra_ic_state) {
+ 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;
- Isolate* isolate = name->GetIsolate();
Handle<Map> stub_holder = IC::GetICCacheHolder(*type, isolate, &flag);
Handle<Code> ic;
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Tue Jul 29 16:07:34
2014 UTC
+++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Tue Jul 29 17:02:52
2014 UTC
@@ -1234,8 +1234,14 @@
if (check == PROPERTY &&
(kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
- __ Cmp(this->name(), 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(), 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.