Commit 6366a010 authored by Benedikt Meurer's avatar Benedikt Meurer Committed by Commit Bot

[ic] Internalize strings on the fly in KeyedLoadICGeneric.

This turns on the existing --internalize_on_the_fly flag for the
MEGAMORPHIC KeyedLoadIC to properly internalize strings before
looking up the property. This avoids the otherwise taken runtime
call to %KeyedGetProperty, which is definitely slower.

Initially the --internalize_on_the_fly flag was turned off because
internalizing strings on the fly causes too much traffic on the
megamorphic stub cache. We avoid this problem here by not probing
the stub cache in that case, which still gives the benefit of not
having to go to the runtime.

This improves the babylon test on the web-tooling-benchmark by around
2-3% and will probably also help with several tests (like React or
Ember) on the Speedometer benchmark.

If this CL causes trouble (i.e. tanks something important), we can
just turn off the --internalize_on_the_fly flag again.

Bug: v8:6936, v8:7026
Change-Id: Ia59a8a3799d9624d831d66b05bae3ecef31cee0a
Reviewed-on: https://chromium-review.googlesource.com/750821Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49072}
parent 793c52ed
...@@ -304,7 +304,7 @@ DEFINE_BOOL(trace_block_coverage, false, ...@@ -304,7 +304,7 @@ DEFINE_BOOL(trace_block_coverage, false,
DEFINE_BOOL(feedback_normalization, false, DEFINE_BOOL(feedback_normalization, false,
"feed back normalization to constructors") "feed back normalization to constructors")
// TODO(jkummerow): This currently adds too much load on the stub cache. // TODO(jkummerow): This currently adds too much load on the stub cache.
DEFINE_BOOL_READONLY(internalize_on_the_fly, false, DEFINE_BOOL_READONLY(internalize_on_the_fly, true,
"internalize string keys for generic keyed ICs on the fly") "internalize string keys for generic keyed ICs on the fly")
// Flags for optimization types. // Flags for optimization types.
......
...@@ -2400,14 +2400,32 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { ...@@ -2400,14 +2400,32 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
BIND(&if_notunique); BIND(&if_notunique);
{ {
if (FLAG_internalize_on_the_fly) { if (FLAG_internalize_on_the_fly) {
Label not_in_string_table(this); Label if_in_string_table(this), if_not_in_string_table(this);
TryInternalizeString(p->name, &if_index, &var_index, &if_unique_name, TryInternalizeString(p->name, &if_index, &var_index, &if_in_string_table,
&var_unique, &not_in_string_table, &slow); &var_unique, &if_not_in_string_table, &slow);
BIND(&not_in_string_table); BIND(&if_in_string_table);
// If the string was not found in the string table, then no object can {
// have a property with that name. // TODO(bmeurer): We currently use a version of GenericPropertyLoad
Return(UndefinedConstant()); // here, where we don't try to probe the megamorphic stub cache after
// successfully internalizing the incoming string. Past experiments
// with this have shown that it causes too much traffic on the stub
// cache. We may want to re-evaluate that in the future. Original
// note on the --internalize_on_the_fly flag:
//
// TODO(jkummerow): This currently adds too much load on the stub cache.
LoadICParameters pp = *p;
pp.name = var_unique.value();
GenericPropertyLoad(receiver, receiver_map, instance_type, &pp, &slow,
kDontUseStubCache);
}
BIND(&if_not_in_string_table);
{
// If the string was not found in the string table, then no object can
// have a property with that name.
Return(UndefinedConstant());
}
} else { } else {
Goto(&slow); Goto(&slow);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment