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

Side by Side Diff: src/compiler/js-create-lowering.cc

Issue 2509623002: [turbofan] Sparse representation for state values (Closed)
Patch Set: Renaming and changing refs to pointers Created 4 years 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 unified diff | Download patch
« no previous file with comments | « src/compiler/instruction-selector.cc ('k') | src/compiler/js-graph.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/js-create-lowering.h" 5 #include "src/compiler/js-create-lowering.h"
6 6
7 #include "src/allocation-site-scopes.h" 7 #include "src/allocation-site-scopes.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/compilation-dependencies.h" 9 #include "src/compilation-dependencies.h"
10 #include "src/compiler/access-builder.h" 10 #include "src/compiler/access-builder.h"
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 1007
1008 // Prepare an iterator over argument values recorded in the frame state. 1008 // Prepare an iterator over argument values recorded in the frame state.
1009 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput); 1009 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput);
1010 StateValuesAccess parameters_access(parameters); 1010 StateValuesAccess parameters_access(parameters);
1011 auto parameters_it = ++parameters_access.begin(); 1011 auto parameters_it = ++parameters_access.begin();
1012 1012
1013 // Actually allocate the backing store. 1013 // Actually allocate the backing store.
1014 AllocationBuilder a(jsgraph(), effect, control); 1014 AllocationBuilder a(jsgraph(), effect, control);
1015 a.AllocateArray(argument_count, factory()->fixed_array_map()); 1015 a.AllocateArray(argument_count, factory()->fixed_array_map());
1016 for (int i = 0; i < argument_count; ++i, ++parameters_it) { 1016 for (int i = 0; i < argument_count; ++i, ++parameters_it) {
1017 DCHECK_NOT_NULL((*parameters_it).node);
1017 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node); 1018 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node);
1018 } 1019 }
1019 return a.Finish(); 1020 return a.Finish();
1020 } 1021 }
1021 1022
1022 // Helper that allocates a FixedArray holding argument values recorded in the 1023 // Helper that allocates a FixedArray holding argument values recorded in the
1023 // given {frame_state}. Serves as backing store for JSCreateArguments nodes. 1024 // given {frame_state}. Serves as backing store for JSCreateArguments nodes.
1024 Node* JSCreateLowering::AllocateRestArguments(Node* effect, Node* control, 1025 Node* JSCreateLowering::AllocateRestArguments(Node* effect, Node* control,
1025 Node* frame_state, 1026 Node* frame_state,
1026 int start_index) { 1027 int start_index) {
1027 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); 1028 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state);
1028 int argument_count = state_info.parameter_count() - 1; // Minus receiver. 1029 int argument_count = state_info.parameter_count() - 1; // Minus receiver.
1029 int num_elements = std::max(0, argument_count - start_index); 1030 int num_elements = std::max(0, argument_count - start_index);
1030 if (num_elements == 0) return jsgraph()->EmptyFixedArrayConstant(); 1031 if (num_elements == 0) return jsgraph()->EmptyFixedArrayConstant();
1031 1032
1032 // Prepare an iterator over argument values recorded in the frame state. 1033 // Prepare an iterator over argument values recorded in the frame state.
1033 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput); 1034 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput);
1034 StateValuesAccess parameters_access(parameters); 1035 StateValuesAccess parameters_access(parameters);
1035 auto parameters_it = ++parameters_access.begin(); 1036 auto parameters_it = ++parameters_access.begin();
1036 1037
1037 // Skip unused arguments. 1038 // Skip unused arguments.
1038 for (int i = 0; i < start_index; i++) { 1039 for (int i = 0; i < start_index; i++) {
1039 ++parameters_it; 1040 ++parameters_it;
1040 } 1041 }
1041 1042
1042 // Actually allocate the backing store. 1043 // Actually allocate the backing store.
1043 AllocationBuilder a(jsgraph(), effect, control); 1044 AllocationBuilder a(jsgraph(), effect, control);
1044 a.AllocateArray(num_elements, factory()->fixed_array_map()); 1045 a.AllocateArray(num_elements, factory()->fixed_array_map());
1045 for (int i = 0; i < num_elements; ++i, ++parameters_it) { 1046 for (int i = 0; i < num_elements; ++i, ++parameters_it) {
1047 DCHECK_NOT_NULL((*parameters_it).node);
1046 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node); 1048 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node);
1047 } 1049 }
1048 return a.Finish(); 1050 return a.Finish();
1049 } 1051 }
1050 1052
1051 // Helper that allocates a FixedArray serving as a parameter map for values 1053 // Helper that allocates a FixedArray serving as a parameter map for values
1052 // recorded in the given {frame_state}. Some elements map to slots within the 1054 // recorded in the given {frame_state}. Some elements map to slots within the
1053 // given {context}. Serves as backing store for JSCreateArguments nodes. 1055 // given {context}. Serves as backing store for JSCreateArguments nodes.
1054 Node* JSCreateLowering::AllocateAliasedArguments( 1056 Node* JSCreateLowering::AllocateAliasedArguments(
1055 Node* effect, Node* control, Node* frame_state, Node* context, 1057 Node* effect, Node* control, Node* frame_state, Node* context,
1056 Handle<SharedFunctionInfo> shared, bool* has_aliased_arguments) { 1058 Handle<SharedFunctionInfo> shared, bool* has_aliased_arguments) {
1057 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); 1059 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state);
1058 int argument_count = state_info.parameter_count() - 1; // Minus receiver. 1060 int argument_count = state_info.parameter_count() - 1; // Minus receiver.
1059 if (argument_count == 0) return jsgraph()->EmptyFixedArrayConstant(); 1061 if (argument_count == 0) return jsgraph()->EmptyFixedArrayConstant();
1060 1062
1061 // If there is no aliasing, the arguments object elements are not special in 1063 // If there is no aliasing, the arguments object elements are not special in
1062 // any way, we can just return an unmapped backing store instead. 1064 // any way, we can just return an unmapped backing store instead.
1063 int parameter_count = shared->internal_formal_parameter_count(); 1065 int parameter_count = shared->internal_formal_parameter_count();
1064 if (parameter_count == 0) { 1066 if (parameter_count == 0) {
1065 return AllocateArguments(effect, control, frame_state); 1067 return AllocateArguments(effect, control, frame_state);
1066 } 1068 }
1067 1069
1068 // Calculate number of argument values being aliased/mapped. 1070 // Calculate number of argument values being aliased/mapped.
1069 int mapped_count = Min(argument_count, parameter_count); 1071 int mapped_count = Min(argument_count, parameter_count);
1070 *has_aliased_arguments = true; 1072 *has_aliased_arguments = true;
1071 1073
1072 // Prepare an iterator over argument values recorded in the frame state. 1074 // Prepare an iterator over argument values recorded in the frame state.
1073 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput); 1075 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput);
1074 StateValuesAccess parameters_access(parameters); 1076 StateValuesAccess parameters_access(parameters);
1075 auto paratemers_it = ++parameters_access.begin(); 1077 auto parameters_it = ++parameters_access.begin();
1076 1078
1077 // The unmapped argument values recorded in the frame state are stored yet 1079 // The unmapped argument values recorded in the frame state are stored yet
1078 // another indirection away and then linked into the parameter map below, 1080 // another indirection away and then linked into the parameter map below,
1079 // whereas mapped argument values are replaced with a hole instead. 1081 // whereas mapped argument values are replaced with a hole instead.
1080 AllocationBuilder aa(jsgraph(), effect, control); 1082 AllocationBuilder aa(jsgraph(), effect, control);
1081 aa.AllocateArray(argument_count, factory()->fixed_array_map()); 1083 aa.AllocateArray(argument_count, factory()->fixed_array_map());
1082 for (int i = 0; i < mapped_count; ++i, ++paratemers_it) { 1084 for (int i = 0; i < mapped_count; ++i, ++parameters_it) {
1083 aa.Store(AccessBuilder::ForFixedArraySlot(i), jsgraph()->TheHoleConstant()); 1085 aa.Store(AccessBuilder::ForFixedArraySlot(i), jsgraph()->TheHoleConstant());
1084 } 1086 }
1085 for (int i = mapped_count; i < argument_count; ++i, ++paratemers_it) { 1087 for (int i = mapped_count; i < argument_count; ++i, ++parameters_it) {
1086 aa.Store(AccessBuilder::ForFixedArraySlot(i), (*paratemers_it).node); 1088 DCHECK_NOT_NULL((*parameters_it).node);
1089 aa.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node);
1087 } 1090 }
1088 Node* arguments = aa.Finish(); 1091 Node* arguments = aa.Finish();
1089 1092
1090 // Actually allocate the backing store. 1093 // Actually allocate the backing store.
1091 AllocationBuilder a(jsgraph(), arguments, control); 1094 AllocationBuilder a(jsgraph(), arguments, control);
1092 a.AllocateArray(mapped_count + 2, factory()->sloppy_arguments_elements_map()); 1095 a.AllocateArray(mapped_count + 2, factory()->sloppy_arguments_elements_map());
1093 a.Store(AccessBuilder::ForFixedArraySlot(0), context); 1096 a.Store(AccessBuilder::ForFixedArraySlot(0), context);
1094 a.Store(AccessBuilder::ForFixedArraySlot(1), arguments); 1097 a.Store(AccessBuilder::ForFixedArraySlot(1), arguments);
1095 for (int i = 0; i < mapped_count; ++i) { 1098 for (int i = 0; i < mapped_count; ++i) {
1096 int idx = Context::MIN_CONTEXT_SLOTS + parameter_count - 1 - i; 1099 int idx = Context::MIN_CONTEXT_SLOTS + parameter_count - 1 - i;
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 return jsgraph()->simplified(); 1364 return jsgraph()->simplified();
1362 } 1365 }
1363 1366
1364 MachineOperatorBuilder* JSCreateLowering::machine() const { 1367 MachineOperatorBuilder* JSCreateLowering::machine() const {
1365 return jsgraph()->machine(); 1368 return jsgraph()->machine();
1366 } 1369 }
1367 1370
1368 } // namespace compiler 1371 } // namespace compiler
1369 } // namespace internal 1372 } // namespace internal
1370 } // namespace v8 1373 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/instruction-selector.cc ('k') | src/compiler/js-graph.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698