Commit b19d2851 authored by Georg Neis's avatar Georg Neis Committed by Commit Bot

[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: 's avatarJaroslav Sevcik <jarin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#51845}
parent fd29e1d8
...@@ -2117,10 +2117,11 @@ Node* JSCallReducer::DoFilterPostCallbackWork(ElementsKind kind, Node** control, ...@@ -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( ...@@ -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, ...@@ -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 { ...@@ -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 { ...@@ -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);
......
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