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.

Reply via email to