Commit dc83caa6 authored by bmeurer's avatar bmeurer Committed by Commit bot

[turbofan] Mark Array constructor calls as no-write if possible.

If the new.target passed to the Array constructor cannot be a Proxy,
then we know that the Array constructor cannot trigger any observable
side-effects.

R=jarin@chromium.org
BUG=v8:6262

Review-Url: https://codereview.chromium.org/2821453002
Cr-Commit-Position: refs/heads/master@{#44645}
parent 5eec7df9
...@@ -598,6 +598,9 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall( ...@@ -598,6 +598,9 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall(
Node* node, Handle<AllocationSite> site) { Node* node, Handle<AllocationSite> site) {
CreateArrayParameters const& p = CreateArrayParametersOf(node->op()); CreateArrayParameters const& p = CreateArrayParametersOf(node->op());
int const arity = static_cast<int>(p.arity()); int const arity = static_cast<int>(p.arity());
Node* target = NodeProperties::GetValueInput(node, 0);
Node* new_target = NodeProperties::GetValueInput(node, 1);
Type* new_target_type = NodeProperties::GetType(new_target);
ElementsKind elements_kind = site->GetElementsKind(); ElementsKind elements_kind = site->GetElementsKind();
AllocationSiteOverrideMode override_mode = AllocationSiteOverrideMode override_mode =
...@@ -605,12 +608,19 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall( ...@@ -605,12 +608,19 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall(
? DISABLE_ALLOCATION_SITES ? DISABLE_ALLOCATION_SITES
: DONT_OVERRIDE; : DONT_OVERRIDE;
// The Array constructor can only trigger an observable side-effect
// if the new.target may be a proxy.
Operator::Properties const properties =
(new_target != target || new_target_type->Maybe(Type::Proxy()))
? Operator::kNoDeopt
: Operator::kNoDeopt | Operator::kNoWrite;
if (arity == 0) { if (arity == 0) {
ArrayNoArgumentConstructorStub stub(isolate(), elements_kind, ArrayNoArgumentConstructorStub stub(isolate(), elements_kind,
override_mode); override_mode);
CallDescriptor* desc = Linkage::GetStubCallDescriptor( CallDescriptor* desc = Linkage::GetStubCallDescriptor(
isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 1, isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 1,
CallDescriptor::kNeedsFrameState); CallDescriptor::kNeedsFrameState, properties);
node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode()));
node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site)); node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site));
node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(0)); node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(0));
...@@ -628,7 +638,7 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall( ...@@ -628,7 +638,7 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall(
override_mode); override_mode);
CallDescriptor* desc = Linkage::GetStubCallDescriptor( CallDescriptor* desc = Linkage::GetStubCallDescriptor(
isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2,
CallDescriptor::kNeedsFrameState); CallDescriptor::kNeedsFrameState, properties);
node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode()));
node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site)); node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site));
node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(1)); node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(1));
...@@ -655,7 +665,7 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall( ...@@ -655,7 +665,7 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall(
override_mode); override_mode);
CallDescriptor* desc = Linkage::GetStubCallDescriptor( CallDescriptor* desc = Linkage::GetStubCallDescriptor(
isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2,
CallDescriptor::kNeedsFrameState); CallDescriptor::kNeedsFrameState, properties);
Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()), Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()),
node->InputAt(1), node->InputAt(1),
...@@ -678,7 +688,7 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall( ...@@ -678,7 +688,7 @@ Reduction JSCreateLowering::ReduceNewArrayToStubCall(
isolate(), GetHoleyElementsKind(elements_kind), override_mode); isolate(), GetHoleyElementsKind(elements_kind), override_mode);
CallDescriptor* desc = Linkage::GetStubCallDescriptor( CallDescriptor* desc = Linkage::GetStubCallDescriptor(
isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2,
CallDescriptor::kNeedsFrameState); CallDescriptor::kNeedsFrameState, properties);
Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()), Node* inputs[] = {jsgraph()->HeapConstant(stub.GetCode()),
node->InputAt(1), node->InputAt(1),
......
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