Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(491)

Unified Diff: src/compiler/js-typed-lowering.cc

Issue 1676883002: [runtime] Optimize and unify rest parameters. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/js-typed-lowering.cc
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
index abbe6c36d7f245eb6184bab98321ae5410a9e9c0..851b6d69c27ae521ed1cd8a8afec299eacb4b7b9 100644
--- a/src/compiler/js-typed-lowering.cc
+++ b/src/compiler/js-typed-lowering.cc
@@ -1517,7 +1517,7 @@ Node* GetArgumentsFrameState(Node* frame_state) {
Reduction JSTypedLowering::ReduceJSCreateArguments(Node* node) {
DCHECK_EQ(IrOpcode::kJSCreateArguments, node->opcode());
- CreateArgumentsParameters const& p = CreateArgumentsParametersOf(node->op());
+ CreateArgumentsType type = CreateArgumentsTypeOf(node->op());
Node* const frame_state = NodeProperties::GetFrameStateInput(node, 0);
Node* const outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state);
@@ -1525,18 +1525,18 @@ Reduction JSTypedLowering::ReduceJSCreateArguments(Node* node) {
// Use the ArgumentsAccessStub for materializing both mapped and unmapped
// arguments object, but only for non-inlined (i.e. outermost) frames.
if (outer_state->opcode() != IrOpcode::kFrameState) {
- Isolate* isolate = jsgraph()->isolate();
- int parameter_count = state_info.parameter_count() - 1;
- int parameter_offset = parameter_count * kPointerSize;
- int offset = StandardFrameConstants::kCallerSPOffset + parameter_offset;
- Node* parameter_pointer = graph()->NewNode(
- machine()->IntAdd(), graph()->NewNode(machine()->LoadFramePointer()),
- jsgraph()->IntPtrConstant(offset));
-
- if (p.type() != CreateArgumentsParameters::kRestArray) {
+ if (type != CreateArgumentsType::kRestParameter) {
+ // TODO(bmeurer): Cleanup this mess at some point.
+ Isolate* isolate = jsgraph()->isolate();
+ int parameter_count = state_info.parameter_count() - 1;
+ int parameter_offset = parameter_count * kPointerSize;
+ int offset = StandardFrameConstants::kCallerSPOffset + parameter_offset;
+ Node* parameter_pointer = graph()->NewNode(
+ machine()->IntAdd(), graph()->NewNode(machine()->LoadFramePointer()),
+ jsgraph()->IntPtrConstant(offset));
Handle<SharedFunctionInfo> shared;
if (!state_info.shared_info().ToHandle(&shared)) return NoChange();
- bool unmapped = p.type() == CreateArgumentsParameters::kUnmappedArguments;
+ bool unmapped = type == CreateArgumentsType::kUnmappedArguments;
Callable callable = CodeFactory::ArgumentsAccess(
isolate, unmapped, shared->has_duplicate_parameters());
CallDescriptor* desc = Linkage::GetStubCallDescriptor(
@@ -1551,24 +1551,20 @@ Reduction JSTypedLowering::ReduceJSCreateArguments(Node* node) {
NodeProperties::ChangeOp(node, new_op);
return Changed(node);
} else {
- Callable callable = CodeFactory::RestArgumentsAccess(isolate);
+ Callable callable = CodeFactory::FastNewRestParameter(isolate());
CallDescriptor* desc = Linkage::GetStubCallDescriptor(
- isolate, graph()->zone(), callable.descriptor(), 0,
+ isolate(), graph()->zone(), callable.descriptor(), 0,
CallDescriptor::kNeedsFrameState);
const Operator* new_op = common()->Call(desc);
Node* stub_code = jsgraph()->HeapConstant(callable.code());
node->InsertInput(graph()->zone(), 0, stub_code);
- node->ReplaceInput(1, jsgraph()->Constant(parameter_count));
- node->InsertInput(graph()->zone(), 2, parameter_pointer);
- node->InsertInput(graph()->zone(), 3,
- jsgraph()->Constant(p.start_index()));
NodeProperties::ChangeOp(node, new_op);
return Changed(node);
}
} else if (outer_state->opcode() == IrOpcode::kFrameState) {
// Use inline allocation for all mapped arguments objects within inlined
// (i.e. non-outermost) frames, independent of the object size.
- if (p.type() == CreateArgumentsParameters::kMappedArguments) {
+ if (type == CreateArgumentsType::kMappedArguments) {
Handle<SharedFunctionInfo> shared;
if (!state_info.shared_info().ToHandle(&shared)) return NoChange();
Node* const callee = NodeProperties::GetValueInput(node, 0);
@@ -1610,7 +1606,7 @@ Reduction JSTypedLowering::ReduceJSCreateArguments(Node* node) {
RelaxControls(node);
a.FinishAndChange(node);
return Changed(node);
- } else if (p.type() == CreateArgumentsParameters::kUnmappedArguments) {
+ } else if (type == CreateArgumentsType::kUnmappedArguments) {
// Use inline allocation for all unmapped arguments objects within inlined
// (i.e. non-outermost) frames, independent of the object size.
Node* const control = NodeProperties::GetControlInput(node);
@@ -1645,7 +1641,10 @@ Reduction JSTypedLowering::ReduceJSCreateArguments(Node* node) {
RelaxControls(node);
a.FinishAndChange(node);
return Changed(node);
- } else if (p.type() == CreateArgumentsParameters::kRestArray) {
+ } else if (type == CreateArgumentsType::kRestParameter) {
+ Handle<SharedFunctionInfo> shared;
+ if (!state_info.shared_info().ToHandle(&shared)) return NoChange();
+ int start_index = shared->internal_formal_parameter_count();
// Use inline allocation for all unmapped arguments objects within inlined
// (i.e. non-outermost) frames, independent of the object size.
Node* const control = NodeProperties::GetControlInput(node);
@@ -1658,7 +1657,7 @@ Reduction JSTypedLowering::ReduceJSCreateArguments(Node* node) {
FrameStateInfo args_state_info = OpParameter<FrameStateInfo>(args_state);
// Prepare element backing store to be used by the rest array.
Node* const elements =
- AllocateRestArguments(effect, control, args_state, p.start_index());
+ AllocateRestArguments(effect, control, args_state, start_index);
effect = elements->op()->EffectOutputCount() > 0 ? elements : effect;
// Load the JSArray object map from the current native context.
Node* const load_native_context = effect = graph()->NewNode(
@@ -1674,7 +1673,7 @@ Reduction JSTypedLowering::ReduceJSCreateArguments(Node* node) {
// -1 to minus receiver
int argument_count = args_state_info.parameter_count() - 1;
- int length = std::max(0, argument_count - p.start_index());
+ int length = std::max(0, argument_count - start_index);
STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize);
a.Allocate(JSArray::kSize);
a.Store(AccessBuilder::ForMap(), load_jsarray_map);

Powered by Google App Engine
This is Rietveld 408576698