[compiler] Try to convert value to Smi in StoreField/StoreElement.
If the value can be converted, we can skip the write barrier. Change-Id: I88ac7f3756ddfaf4b8e58dc36a9b26faf544f0d9 Reviewed-on: https://chromium-review.googlesource.com/957033 Commit-Queue: Georg Neis <neis@chromium.org> Reviewed-by: Jaroslav Sevcik <jarin@chromium.org> Cr-Commit-Position: refs/heads/master@{#51845}
This commit is contained in:
parent
fd29e1d841
commit
b19d2851bf
@ -2117,10 +2117,11 @@ Node* JSCallReducer::DoFilterPostCallbackWork(ElementsKind kind, Node** control,
|
|||||||
simplified()->LoadField(AccessBuilder::ForJSObjectElements()), a, etrue,
|
simplified()->LoadField(AccessBuilder::ForJSObjectElements()), a, etrue,
|
||||||
if_true);
|
if_true);
|
||||||
|
|
||||||
// We know that {to} is in Unsigned31 range here, being smaller than
|
DCHECK(TypeCache::Get().kFixedDoubleArrayLengthType->Is(
|
||||||
// {original_length} at all times.
|
TypeCache::Get().kFixedArrayLengthType));
|
||||||
Node* checked_to = etrue = graph()->NewNode(
|
Node* checked_to = etrue = graph()->NewNode(
|
||||||
common()->TypeGuard(Type::Unsigned31()), to, etrue, if_true);
|
common()->TypeGuard(TypeCache::Get().kFixedArrayLengthType), to, etrue,
|
||||||
|
if_true);
|
||||||
Node* elements_length = etrue = graph()->NewNode(
|
Node* elements_length = etrue = graph()->NewNode(
|
||||||
simplified()->LoadField(AccessBuilder::ForFixedArrayLength()), elements,
|
simplified()->LoadField(AccessBuilder::ForFixedArrayLength()), elements,
|
||||||
etrue, if_true);
|
etrue, if_true);
|
||||||
|
@ -2728,6 +2728,10 @@ Node* JSNativeContextSpecialization::BuildExtendPropertiesBackingStore(
|
|||||||
}
|
}
|
||||||
Node* new_length_and_hash = graph()->NewNode(
|
Node* new_length_and_hash = graph()->NewNode(
|
||||||
simplified()->NumberBitwiseOr(), jsgraph()->Constant(new_length), hash);
|
simplified()->NumberBitwiseOr(), jsgraph()->Constant(new_length), hash);
|
||||||
|
// TDOO(jarin): Fix the typer to infer tighter bound for NumberBitwiseOr.
|
||||||
|
new_length_and_hash = effect =
|
||||||
|
graph()->NewNode(common()->TypeGuard(Type::SignedSmall()),
|
||||||
|
new_length_and_hash, effect, control);
|
||||||
|
|
||||||
// Allocate and initialize the new properties.
|
// Allocate and initialize the new properties.
|
||||||
AllocationBuilder a(jsgraph(), effect, control);
|
AllocationBuilder a(jsgraph(), effect, control);
|
||||||
|
@ -126,6 +126,7 @@ UseInfo CheckedUseInfoAsFloat64FromHint(NumberOperationHint hint,
|
|||||||
UseInfo TruncatingUseInfoFromRepresentation(MachineRepresentation rep) {
|
UseInfo TruncatingUseInfoFromRepresentation(MachineRepresentation rep) {
|
||||||
switch (rep) {
|
switch (rep) {
|
||||||
case MachineRepresentation::kTaggedSigned:
|
case MachineRepresentation::kTaggedSigned:
|
||||||
|
return UseInfo::TaggedSigned();
|
||||||
case MachineRepresentation::kTaggedPointer:
|
case MachineRepresentation::kTaggedPointer:
|
||||||
case MachineRepresentation::kTagged:
|
case MachineRepresentation::kTagged:
|
||||||
return UseInfo::AnyTagged();
|
return UseInfo::AnyTagged();
|
||||||
@ -2551,6 +2552,11 @@ class RepresentationSelector {
|
|||||||
MachineRepresentation field_representation =
|
MachineRepresentation field_representation =
|
||||||
access.machine_type.representation();
|
access.machine_type.representation();
|
||||||
|
|
||||||
|
// Convert to Smi if possible, such that we can avoid a write barrier.
|
||||||
|
if (field_representation == MachineRepresentation::kTagged &&
|
||||||
|
TypeOf(value_node)->Is(Type::SignedSmall())) {
|
||||||
|
field_representation = MachineRepresentation::kTaggedSigned;
|
||||||
|
}
|
||||||
WriteBarrierKind write_barrier_kind = WriteBarrierKindFor(
|
WriteBarrierKind write_barrier_kind = WriteBarrierKindFor(
|
||||||
access.base_is_tagged, field_representation, access.offset,
|
access.base_is_tagged, field_representation, access.offset,
|
||||||
access.type, input_info->representation(), value_node);
|
access.type, input_info->representation(), value_node);
|
||||||
@ -2584,6 +2590,11 @@ class RepresentationSelector {
|
|||||||
MachineRepresentation element_representation =
|
MachineRepresentation element_representation =
|
||||||
access.machine_type.representation();
|
access.machine_type.representation();
|
||||||
|
|
||||||
|
// Convert to Smi if possible, such that we can avoid a write barrier.
|
||||||
|
if (element_representation == MachineRepresentation::kTagged &&
|
||||||
|
TypeOf(value_node)->Is(Type::SignedSmall())) {
|
||||||
|
element_representation = MachineRepresentation::kTaggedSigned;
|
||||||
|
}
|
||||||
WriteBarrierKind write_barrier_kind = WriteBarrierKindFor(
|
WriteBarrierKind write_barrier_kind = WriteBarrierKindFor(
|
||||||
access.base_is_tagged, element_representation, access.type,
|
access.base_is_tagged, element_representation, access.type,
|
||||||
input_info->representation(), value_node);
|
input_info->representation(), value_node);
|
||||||
|
Loading…
Reference in New Issue
Block a user