[ptr-compr][turbofan] Specialize accesses known to be pointers.
There are some accesses that we know that are pointers, and we can specialize them to have Pointer as their Machine Type and Write Barrier. Drive-by fix: ForJSGeneratorObjectParametersAndRegisters can be changed to use Pointer. Bug: v8:7703 Change-Id: I88e371746fc5f08c84795c95b1885264ef6c067c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1741658 Commit-Queue: Santiago Aboy Solanes <solanes@chromium.org> Reviewed-by: Georg Neis <neis@chromium.org> Cr-Commit-Position: refs/heads/master@{#63223}
This commit is contained in:
parent
1ec039466e
commit
1b7f99a0cb
@ -89,6 +89,16 @@ FieldAccess AccessBuilder::ForJSObjectPropertiesOrHash() {
|
||||
return access;
|
||||
}
|
||||
|
||||
// static
|
||||
FieldAccess AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer() {
|
||||
FieldAccess access = {
|
||||
kTaggedBase, JSObject::kPropertiesOrHashOffset,
|
||||
MaybeHandle<Name>(), MaybeHandle<Map>(),
|
||||
Type::Any(), MachineType::TypeCompressedTaggedPointer(),
|
||||
kPointerWriteBarrier, LoadSensitivity::kCritical};
|
||||
return access;
|
||||
}
|
||||
|
||||
// static
|
||||
FieldAccess AccessBuilder::ForJSObjectElements() {
|
||||
FieldAccess access = {
|
||||
@ -292,7 +302,7 @@ FieldAccess AccessBuilder::ForJSGeneratorObjectParametersAndRegisters() {
|
||||
FieldAccess access = {
|
||||
kTaggedBase, JSGeneratorObject::kParametersAndRegistersOffset,
|
||||
Handle<Name>(), MaybeHandle<Map>(),
|
||||
Type::Internal(), MachineType::TypeCompressedTagged(),
|
||||
Type::Internal(), MachineType::TypeCompressedTaggedPointer(),
|
||||
kPointerWriteBarrier};
|
||||
return access;
|
||||
}
|
||||
@ -864,6 +874,19 @@ FieldAccess AccessBuilder::ForContextSlot(size_t index) {
|
||||
return access;
|
||||
}
|
||||
|
||||
// static
|
||||
FieldAccess AccessBuilder::ForContextSlotKnownPointer(size_t index) {
|
||||
int offset = Context::OffsetOfElementAt(static_cast<int>(index));
|
||||
DCHECK_EQ(offset,
|
||||
Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
|
||||
FieldAccess access = {
|
||||
kTaggedBase, offset,
|
||||
Handle<Name>(), MaybeHandle<Map>(),
|
||||
Type::Any(), MachineType::TypeCompressedTaggedPointer(),
|
||||
kPointerWriteBarrier};
|
||||
return access;
|
||||
}
|
||||
|
||||
// static
|
||||
ElementAccess AccessBuilder::ForFixedArrayElement() {
|
||||
ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Any(),
|
||||
|
@ -54,6 +54,9 @@ class V8_EXPORT_PRIVATE AccessBuilder final
|
||||
// Provides access to JSObject::properties() field.
|
||||
static FieldAccess ForJSObjectPropertiesOrHash();
|
||||
|
||||
// Provides access to JSObject::properties() field for known pointers.
|
||||
static FieldAccess ForJSObjectPropertiesOrHashKnownPointer();
|
||||
|
||||
// Provides access to JSObject::elements() field.
|
||||
static FieldAccess ForJSObjectElements();
|
||||
|
||||
@ -271,6 +274,9 @@ class V8_EXPORT_PRIVATE AccessBuilder final
|
||||
// Provides access to Context slots.
|
||||
static FieldAccess ForContextSlot(size_t index);
|
||||
|
||||
// Provides access to Context slots that are known to be pointers.
|
||||
static FieldAccess ForContextSlotKnownPointer(size_t index);
|
||||
|
||||
// Provides access to FixedArray elements.
|
||||
static ElementAccess ForFixedArrayElement();
|
||||
static ElementAccess ForFixedArrayElement(
|
||||
|
@ -4778,8 +4778,8 @@ Node* EffectControlLinearizer::LowerLoadFieldByIndex(Node* node) {
|
||||
// The {index} is equal to the negated out of property index plus 1.
|
||||
__ Bind(&if_outofobject);
|
||||
{
|
||||
Node* properties =
|
||||
__ LoadField(AccessBuilder::ForJSObjectPropertiesOrHash(), object);
|
||||
Node* properties = __ LoadField(
|
||||
AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(), object);
|
||||
Node* offset =
|
||||
__ IntAdd(__ WordShl(__ IntSub(zero, index),
|
||||
__ IntPtrConstant(kTaggedSizeLog2 - 1)),
|
||||
@ -4821,8 +4821,8 @@ Node* EffectControlLinearizer::LowerLoadFieldByIndex(Node* node) {
|
||||
|
||||
__ Bind(&if_outofobject);
|
||||
{
|
||||
Node* properties =
|
||||
__ LoadField(AccessBuilder::ForJSObjectPropertiesOrHash(), object);
|
||||
Node* properties = __ LoadField(
|
||||
AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(), object);
|
||||
Node* offset =
|
||||
__ IntAdd(__ WordShl(__ IntSub(zero, index),
|
||||
__ IntPtrConstant(kTaggedSizeLog2)),
|
||||
|
@ -1742,7 +1742,8 @@ Reduction JSCallReducer::ReduceArrayFilter(
|
||||
Type::Array());
|
||||
ab.Store(AccessBuilder::ForMap(), initial_map);
|
||||
Node* empty_fixed_array = jsgraph()->EmptyFixedArrayConstant();
|
||||
ab.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), empty_fixed_array);
|
||||
ab.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
empty_fixed_array);
|
||||
ab.Store(AccessBuilder::ForJSObjectElements(), empty_fixed_array);
|
||||
ab.Store(AccessBuilder::ForJSArrayLength(packed_kind),
|
||||
jsgraph()->ZeroConstant());
|
||||
|
@ -127,7 +127,7 @@ Reduction JSCreateLowering::ReduceJSCreate(Node* node) {
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(slack_tracking_prediction.instance_size());
|
||||
a.Store(AccessBuilder::ForMap(), *initial_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -180,11 +180,11 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
||||
: native_context().sloppy_arguments_map());
|
||||
// Actually allocate and initialize the arguments object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
STATIC_ASSERT(JSSloppyArgumentsObject::kSize == 5 * kTaggedSize);
|
||||
a.Allocate(JSSloppyArgumentsObject::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), arguments_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForArgumentsLength(), arguments_length);
|
||||
a.Store(AccessBuilder::ForArgumentsCallee(), callee);
|
||||
@ -209,11 +209,11 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
||||
jsgraph()->Constant(native_context().strict_arguments_map());
|
||||
// Actually allocate and initialize the arguments object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kTaggedSize);
|
||||
a.Allocate(JSStrictArgumentsObject::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), arguments_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForArgumentsLength(), arguments_length);
|
||||
RelaxControls(node);
|
||||
@ -239,11 +239,11 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
||||
native_context().js_array_packed_elements_map());
|
||||
// Actually allocate and initialize the jsarray.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
STATIC_ASSERT(JSArray::kSize == 4 * kTaggedSize);
|
||||
a.Allocate(JSArray::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), jsarray_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForJSArrayLength(PACKED_ELEMENTS), rest_length);
|
||||
RelaxControls(node);
|
||||
@ -284,12 +284,12 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
||||
: native_context().sloppy_arguments_map());
|
||||
// Actually allocate and initialize the arguments object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
int length = args_state_info.parameter_count() - 1; // Minus receiver.
|
||||
STATIC_ASSERT(JSSloppyArgumentsObject::kSize == 5 * kTaggedSize);
|
||||
a.Allocate(JSSloppyArgumentsObject::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), arguments_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForArgumentsLength(), jsgraph()->Constant(length));
|
||||
a.Store(AccessBuilder::ForArgumentsCallee(), callee);
|
||||
@ -320,12 +320,12 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
||||
jsgraph()->Constant(native_context().strict_arguments_map());
|
||||
// Actually allocate and initialize the arguments object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
int length = args_state_info.parameter_count() - 1; // Minus receiver.
|
||||
STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kTaggedSize);
|
||||
a.Allocate(JSStrictArgumentsObject::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), arguments_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForArgumentsLength(), jsgraph()->Constant(length));
|
||||
RelaxControls(node);
|
||||
@ -357,7 +357,6 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
||||
jsgraph()->Constant(native_context().js_array_packed_elements_map());
|
||||
// Actually allocate and initialize the jsarray.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
|
||||
// -1 to minus receiver
|
||||
int argument_count = args_state_info.parameter_count() - 1;
|
||||
@ -365,7 +364,8 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
||||
STATIC_ASSERT(JSArray::kSize == 4 * kTaggedSize);
|
||||
a.Allocate(JSArray::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), jsarray_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForJSArrayLength(PACKED_ELEMENTS),
|
||||
jsgraph()->Constant(length));
|
||||
@ -416,11 +416,12 @@ Reduction JSCreateLowering::ReduceJSCreateGeneratorObject(Node* node) {
|
||||
// Emit code to allocate the JS[Async]GeneratorObject instance.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(slack_tracking_prediction.instance_size());
|
||||
Node* empty_fixed_array = jsgraph()->EmptyFixedArrayConstant();
|
||||
Node* undefined = jsgraph()->UndefinedConstant();
|
||||
a.Store(AccessBuilder::ForMap(), initial_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), empty_fixed_array);
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), empty_fixed_array);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSGeneratorObjectContext(), context);
|
||||
a.Store(AccessBuilder::ForJSGeneratorObjectFunction(), closure);
|
||||
a.Store(AccessBuilder::ForJSGeneratorObjectReceiver(), receiver);
|
||||
@ -480,13 +481,13 @@ Reduction JSCreateLowering::ReduceNewArray(
|
||||
? simplified()->NewDoubleElements(allocation)
|
||||
: simplified()->NewSmiOrObjectElements(allocation),
|
||||
length, effect, control);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
|
||||
// Perform the allocation of the actual JSArray object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(slack_tracking_prediction.instance_size(), allocation);
|
||||
a.Store(AccessBuilder::ForMap(), initial_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForJSArrayLength(initial_map.elements_kind()), length);
|
||||
for (int i = 0; i < slack_tracking_prediction.inobject_property_count();
|
||||
@ -526,13 +527,13 @@ Reduction JSCreateLowering::ReduceNewArray(
|
||||
elements = effect =
|
||||
AllocateElements(effect, control, elements_kind, capacity, allocation);
|
||||
}
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
|
||||
// Perform the allocation of the actual JSArray object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(slack_tracking_prediction.instance_size(), allocation);
|
||||
a.Store(AccessBuilder::ForMap(), initial_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForJSArrayLength(elements_kind), length);
|
||||
for (int i = 0; i < slack_tracking_prediction.inobject_property_count();
|
||||
@ -583,14 +584,14 @@ Reduction JSCreateLowering::ReduceNewArray(
|
||||
// Setup elements, properties and length.
|
||||
Node* elements = effect =
|
||||
AllocateElements(effect, control, elements_kind, values, allocation);
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
Node* length = jsgraph()->Constant(static_cast<int>(values.size()));
|
||||
|
||||
// Perform the allocation of the actual JSArray object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(slack_tracking_prediction.instance_size(), allocation);
|
||||
a.Store(AccessBuilder::ForMap(), initial_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForJSArrayLength(elements_kind), length);
|
||||
for (int i = 0; i < slack_tracking_prediction.inobject_property_count();
|
||||
@ -735,7 +736,7 @@ Reduction JSCreateLowering::ReduceJSCreateArrayIterator(Node* node) {
|
||||
Type::OtherObject());
|
||||
a.Store(AccessBuilder::ForMap(),
|
||||
native_context().initial_array_iterator_map());
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -771,11 +772,12 @@ Reduction JSCreateLowering::ReduceJSCreateAsyncFunctionObject(Node* node) {
|
||||
// Create the JSAsyncFunctionObject result.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(JSAsyncFunctionObject::kSize);
|
||||
Node* empty_fixed_array = jsgraph()->EmptyFixedArrayConstant();
|
||||
a.Store(AccessBuilder::ForMap(),
|
||||
native_context().async_function_object_map());
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), empty_fixed_array);
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), empty_fixed_array);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSGeneratorObjectContext(), context);
|
||||
a.Store(AccessBuilder::ForJSGeneratorObjectFunction(), closure);
|
||||
a.Store(AccessBuilder::ForJSGeneratorObjectReceiver(), receiver);
|
||||
@ -844,7 +846,7 @@ Reduction JSCreateLowering::ReduceJSCreateCollectionIterator(Node* node) {
|
||||
a.Store(AccessBuilder::ForMap(),
|
||||
MapForCollectionIterationKind(native_context(), p.collection_kind(),
|
||||
p.iteration_kind()));
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -884,7 +886,7 @@ Reduction JSCreateLowering::ReduceJSCreateBoundFunction(Node* node) {
|
||||
a.Allocate(JSBoundFunction::kSize, AllocationType::kYoung,
|
||||
Type::BoundFunction());
|
||||
a.Store(AccessBuilder::ForMap(), map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -936,7 +938,7 @@ Reduction JSCreateLowering::ReduceJSCreateClosure(Node* node) {
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(function_map.instance_size(), allocation, Type::Function());
|
||||
a.Store(AccessBuilder::ForMap(), function_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -972,7 +974,7 @@ Reduction JSCreateLowering::ReduceJSCreateIterResultObject(Node* node) {
|
||||
AllocationBuilder a(jsgraph(), effect, graph()->start());
|
||||
a.Allocate(JSIteratorResult::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), iterator_result_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -995,7 +997,7 @@ Reduction JSCreateLowering::ReduceJSCreateStringIterator(Node* node) {
|
||||
a.Allocate(JSStringIterator::kSize, AllocationType::kYoung,
|
||||
Type::OtherObject());
|
||||
a.Store(AccessBuilder::ForMap(), map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -1014,7 +1016,6 @@ Reduction JSCreateLowering::ReduceJSCreateKeyValueArray(Node* node) {
|
||||
|
||||
Node* array_map =
|
||||
jsgraph()->Constant(native_context().js_array_packed_elements_map());
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
Node* length = jsgraph()->Constant(2);
|
||||
|
||||
AllocationBuilder aa(jsgraph(), effect, graph()->start());
|
||||
@ -1028,7 +1029,8 @@ Reduction JSCreateLowering::ReduceJSCreateKeyValueArray(Node* node) {
|
||||
AllocationBuilder a(jsgraph(), elements, graph()->start());
|
||||
a.Allocate(JSArray::kSize);
|
||||
a.Store(AccessBuilder::ForMap(), array_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
a.Store(AccessBuilder::ForJSArrayLength(PACKED_ELEMENTS), length);
|
||||
STATIC_ASSERT(JSArray::kSize == 4 * kTaggedSize);
|
||||
@ -1045,7 +1047,7 @@ Reduction JSCreateLowering::ReduceJSCreatePromise(Node* node) {
|
||||
AllocationBuilder a(jsgraph(), effect, graph()->start());
|
||||
a.Allocate(promise_map.instance_size());
|
||||
a.Store(AccessBuilder::ForMap(), promise_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(),
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
@ -1128,13 +1130,13 @@ Reduction JSCreateLowering::ReduceJSCreateEmptyLiteralObject(Node* node) {
|
||||
|
||||
// Setup elements and properties.
|
||||
Node* elements = jsgraph()->EmptyFixedArrayConstant();
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
|
||||
// Perform the allocation of the actual JSArray object.
|
||||
AllocationBuilder a(jsgraph(), effect, control);
|
||||
a.Allocate(map.instance_size());
|
||||
a.Store(AccessBuilder::ForMap(), js_object_map);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
a.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
for (int i = 0; i < map.GetInObjectProperties(); i++) {
|
||||
a.Store(AccessBuilder::ForJSObjectInObjectProperty(map, i),
|
||||
@ -1601,9 +1603,6 @@ Node* JSCreateLowering::AllocateElements(Node* effect, Node* control,
|
||||
Node* JSCreateLowering::AllocateFastLiteral(Node* effect, Node* control,
|
||||
JSObjectRef boilerplate,
|
||||
AllocationType allocation) {
|
||||
// Setup the properties backing store.
|
||||
Node* properties = jsgraph()->EmptyFixedArrayConstant();
|
||||
|
||||
// Compute the in-object properties to store first (might have effects).
|
||||
MapRef boilerplate_map = boilerplate.map();
|
||||
ZoneVector<std::pair<FieldAccess, Node*>> inobject_fields(zone());
|
||||
@ -1695,7 +1694,8 @@ Node* JSCreateLowering::AllocateFastLiteral(Node* effect, Node* control,
|
||||
builder.Allocate(boilerplate_map.instance_size(), allocation,
|
||||
Type::For(boilerplate_map));
|
||||
builder.Store(AccessBuilder::ForMap(), boilerplate_map);
|
||||
builder.Store(AccessBuilder::ForJSObjectPropertiesOrHash(), properties);
|
||||
builder.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
|
||||
jsgraph()->EmptyFixedArrayConstant());
|
||||
builder.Store(AccessBuilder::ForJSObjectElements(), elements);
|
||||
if (boilerplate.IsJSArray()) {
|
||||
JSArrayRef boilerplate_array = boilerplate.AsJSArray();
|
||||
|
@ -2227,7 +2227,8 @@ JSNativeContextSpecialization::BuildPropertyStore(
|
||||
Node* storage = receiver;
|
||||
if (!field_index.is_inobject()) {
|
||||
storage = effect = graph()->NewNode(
|
||||
simplified()->LoadField(AccessBuilder::ForJSObjectPropertiesOrHash()),
|
||||
simplified()->LoadField(
|
||||
AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer()),
|
||||
storage, effect, control);
|
||||
}
|
||||
PropertyConstness constness = access_info.IsDataConstant()
|
||||
@ -2386,7 +2387,7 @@ JSNativeContextSpecialization::BuildPropertyStore(
|
||||
storage, value, effect, control);
|
||||
|
||||
// Atomically switch to the new properties below.
|
||||
field_access = AccessBuilder::ForJSObjectPropertiesOrHash();
|
||||
field_access = AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer();
|
||||
value = storage;
|
||||
storage = receiver;
|
||||
}
|
||||
|
@ -1320,7 +1320,7 @@ Reduction JSTypedLowering::ReduceJSLoadContext(Node* node) {
|
||||
for (size_t i = 0; i < access.depth(); ++i) {
|
||||
context = effect = graph()->NewNode(
|
||||
simplified()->LoadField(
|
||||
AccessBuilder::ForContextSlot(Context::PREVIOUS_INDEX)),
|
||||
AccessBuilder::ForContextSlotKnownPointer(Context::PREVIOUS_INDEX)),
|
||||
context, effect, control);
|
||||
}
|
||||
node->ReplaceInput(0, context);
|
||||
@ -1342,7 +1342,7 @@ Reduction JSTypedLowering::ReduceJSStoreContext(Node* node) {
|
||||
for (size_t i = 0; i < access.depth(); ++i) {
|
||||
context = effect = graph()->NewNode(
|
||||
simplified()->LoadField(
|
||||
AccessBuilder::ForContextSlot(Context::PREVIOUS_INDEX)),
|
||||
AccessBuilder::ForContextSlotKnownPointer(Context::PREVIOUS_INDEX)),
|
||||
context, effect, control);
|
||||
}
|
||||
node->ReplaceInput(0, context);
|
||||
|
@ -199,7 +199,8 @@ Node* PropertyAccessBuilder::BuildLoadDataField(
|
||||
Node* storage = ResolveHolder(access_info, receiver);
|
||||
if (!field_index.is_inobject()) {
|
||||
storage = *effect = graph()->NewNode(
|
||||
simplified()->LoadField(AccessBuilder::ForJSObjectPropertiesOrHash()),
|
||||
simplified()->LoadField(
|
||||
AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer()),
|
||||
storage, *effect, *control);
|
||||
}
|
||||
PropertyConstness constness = access_info.IsDataConstant()
|
||||
|
@ -114,7 +114,7 @@ TEST(DisasmPoisonPolymorphicLoad) {
|
||||
"csel " + kPReg + ", xzr, " + kPReg + ", ne", // update the poison
|
||||
"csdb", // spec. barrier
|
||||
"ldursw x<<BSt:[0-9]+>>, \\[<<Obj>>, #[0-9]+\\]", // load backing store
|
||||
"tbz w<<BSt>>, #0, #\\+0x8", // branchful decompress
|
||||
// branchful decompress
|
||||
"add x<<BSt>>, x26, x<<BSt>>", // Add root to ref
|
||||
"and x<<BSt>>, x<<BSt>>, " + kPReg, // apply the poison
|
||||
"ldur w<<Prop:[0-9]+>>, \\[x<<BSt>>, #[0-9]+\\]", // load the property
|
||||
|
@ -322,12 +322,13 @@ TEST_F(JSTypedLoweringTest, JSLoadContext) {
|
||||
Reduction const r2 = Reduce(graph()->NewNode(
|
||||
javascript()->LoadContext(1, index, immutable), context, effect));
|
||||
ASSERT_TRUE(r2.Changed());
|
||||
EXPECT_THAT(r2.replacement(),
|
||||
IsLoadField(AccessBuilder::ForContextSlot(index),
|
||||
IsLoadField(AccessBuilder::ForContextSlot(
|
||||
Context::PREVIOUS_INDEX),
|
||||
context, effect, graph()->start()),
|
||||
_, graph()->start()));
|
||||
EXPECT_THAT(
|
||||
r2.replacement(),
|
||||
IsLoadField(AccessBuilder::ForContextSlot(index),
|
||||
IsLoadField(AccessBuilder::ForContextSlotKnownPointer(
|
||||
Context::PREVIOUS_INDEX),
|
||||
context, effect, graph()->start()),
|
||||
_, graph()->start()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -357,12 +358,13 @@ TEST_F(JSTypedLoweringTest, JSStoreContext) {
|
||||
Reduce(graph()->NewNode(javascript()->StoreContext(1, index), value,
|
||||
context, effect, control));
|
||||
ASSERT_TRUE(r2.Changed());
|
||||
EXPECT_THAT(r2.replacement(),
|
||||
IsStoreField(AccessBuilder::ForContextSlot(index),
|
||||
IsLoadField(AccessBuilder::ForContextSlot(
|
||||
Context::PREVIOUS_INDEX),
|
||||
context, effect, graph()->start()),
|
||||
value, _, control));
|
||||
EXPECT_THAT(
|
||||
r2.replacement(),
|
||||
IsStoreField(AccessBuilder::ForContextSlot(index),
|
||||
IsLoadField(AccessBuilder::ForContextSlotKnownPointer(
|
||||
Context::PREVIOUS_INDEX),
|
||||
context, effect, graph()->start()),
|
||||
value, _, control));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user