Promote double arrays to FAST_ELEMENT that use generic KeyedLoadIC

Review URL: https://chromiumcodereview.appspot.com/9111036

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10652 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
danno@chromium.org 2012-02-09 09:11:04 +00:00
parent d949c64688
commit d89c0b9500
2 changed files with 23 additions and 2 deletions

View File

@ -1120,6 +1120,17 @@ MaybeObject* KeyedLoadIC::Load(State state,
} else if (key->IsSmi() && (target() != *non_strict_arguments_stub())) {
stub = ComputeStub(receiver, LOAD, kNonStrictMode, stub);
}
// If the IC is being replaced by the generic stub, loads from
// FAST_DOUBLE_ELEMENTS arrays will cause unboxing in Crankshafted
// code. To prevent these expensive allocations, proactively promote
// arrays to FAST_ELEMENTS ElementKinds.
if (*stub == *generic_stub()) {
if (receiver->HasFastDoubleElements()) {
MaybeObject* maybe_object =
receiver->TransitionElementsKind(FAST_ELEMENTS);
if (maybe_object->IsFailure()) return maybe_object;
}
}
}
} else {
TRACE_GENERIC_IC("KeyedLoadIC", "force generic");

View File

@ -4270,14 +4270,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) {
// If value is the hole do the general lookup.
}
}
} else if (FLAG_smi_only_arrays && args.at<Object>(1)->IsSmi()) {
} else if (args.at<Object>(1)->IsSmi()) {
// Getting properties from FAST_DOUBLE_ELEMENTS arrays causes boxing. To
// proactively avoid excessive boxing, transition FAST_DOUBLE_ELEMENTS
// arrays to FAST_ELEMENTS if they are accessed via this function, which
// is called by the KeyedLoadIC::GenericStub.
Handle<JSObject> js_object(args.at<JSObject>(0));
if (js_object->HasFastDoubleElements()) {
MaybeObject* maybe_object =
js_object->TransitionElementsKind(FAST_ELEMENTS);
if (maybe_object->IsFailure()) return maybe_object;
}
// JSObject without a string key. If the key is a Smi, check for a
// definite out-of-bounds access to elements, which is a strong indicator
// that subsequent accesses will also call the runtime. Proactively
// transition elements to FAST_ELEMENTS to avoid excessive boxing of
// doubles for those future calls in the case that the elements would
// become FAST_DOUBLE_ELEMENTS.
Handle<JSObject> js_object(args.at<JSObject>(0));
ElementsKind elements_kind = js_object->GetElementsKind();
if (elements_kind == FAST_SMI_ONLY_ELEMENTS ||
elements_kind == FAST_DOUBLE_ELEMENTS) {