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

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

Issue 2509623002: [turbofan] Sparse representation for state values (Closed)
Patch Set: Remove the optimized_out input entirely, return nullptr when iterating Created 4 years, 1 month 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
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 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 922
923 // Prepare an iterator over argument values recorded in the frame state. 923 // Prepare an iterator over argument values recorded in the frame state.
924 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput); 924 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput);
925 StateValuesAccess parameters_access(parameters); 925 StateValuesAccess parameters_access(parameters);
926 auto parameters_it = ++parameters_access.begin(); 926 auto parameters_it = ++parameters_access.begin();
927 927
928 // Actually allocate the backing store. 928 // Actually allocate the backing store.
929 AllocationBuilder a(jsgraph(), effect, control); 929 AllocationBuilder a(jsgraph(), effect, control);
930 a.AllocateArray(argument_count, factory()->fixed_array_map()); 930 a.AllocateArray(argument_count, factory()->fixed_array_map());
931 for (int i = 0; i < argument_count; ++i, ++parameters_it) { 931 for (int i = 0; i < argument_count; ++i, ++parameters_it) {
932 DCHECK_NOT_NULL((*parameters_it).node);
932 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node); 933 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node);
933 } 934 }
934 return a.Finish(); 935 return a.Finish();
935 } 936 }
936 937
937 // Helper that allocates a FixedArray holding argument values recorded in the 938 // Helper that allocates a FixedArray holding argument values recorded in the
938 // given {frame_state}. Serves as backing store for JSCreateArguments nodes. 939 // given {frame_state}. Serves as backing store for JSCreateArguments nodes.
939 Node* JSCreateLowering::AllocateRestArguments(Node* effect, Node* control, 940 Node* JSCreateLowering::AllocateRestArguments(Node* effect, Node* control,
940 Node* frame_state, 941 Node* frame_state,
941 int start_index) { 942 int start_index) {
942 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); 943 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state);
943 int argument_count = state_info.parameter_count() - 1; // Minus receiver. 944 int argument_count = state_info.parameter_count() - 1; // Minus receiver.
944 int num_elements = std::max(0, argument_count - start_index); 945 int num_elements = std::max(0, argument_count - start_index);
945 if (num_elements == 0) return jsgraph()->EmptyFixedArrayConstant(); 946 if (num_elements == 0) return jsgraph()->EmptyFixedArrayConstant();
946 947
947 // Prepare an iterator over argument values recorded in the frame state. 948 // Prepare an iterator over argument values recorded in the frame state.
948 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput); 949 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput);
949 StateValuesAccess parameters_access(parameters); 950 StateValuesAccess parameters_access(parameters);
950 auto parameters_it = ++parameters_access.begin(); 951 auto parameters_it = ++parameters_access.begin();
951 952
952 // Skip unused arguments. 953 // Skip unused arguments.
953 for (int i = 0; i < start_index; i++) { 954 for (int i = 0; i < start_index; i++) {
954 ++parameters_it; 955 ++parameters_it;
955 } 956 }
956 957
957 // Actually allocate the backing store. 958 // Actually allocate the backing store.
958 AllocationBuilder a(jsgraph(), effect, control); 959 AllocationBuilder a(jsgraph(), effect, control);
959 a.AllocateArray(num_elements, factory()->fixed_array_map()); 960 a.AllocateArray(num_elements, factory()->fixed_array_map());
960 for (int i = 0; i < num_elements; ++i, ++parameters_it) { 961 for (int i = 0; i < num_elements; ++i, ++parameters_it) {
962 DCHECK_NOT_NULL((*parameters_it).node);
961 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node); 963 a.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node);
962 } 964 }
963 return a.Finish(); 965 return a.Finish();
964 } 966 }
965 967
966 // Helper that allocates a FixedArray serving as a parameter map for values 968 // Helper that allocates a FixedArray serving as a parameter map for values
967 // recorded in the given {frame_state}. Some elements map to slots within the 969 // recorded in the given {frame_state}. Some elements map to slots within the
968 // given {context}. Serves as backing store for JSCreateArguments nodes. 970 // given {context}. Serves as backing store for JSCreateArguments nodes.
969 Node* JSCreateLowering::AllocateAliasedArguments( 971 Node* JSCreateLowering::AllocateAliasedArguments(
970 Node* effect, Node* control, Node* frame_state, Node* context, 972 Node* effect, Node* control, Node* frame_state, Node* context,
971 Handle<SharedFunctionInfo> shared, bool* has_aliased_arguments) { 973 Handle<SharedFunctionInfo> shared, bool* has_aliased_arguments) {
972 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state); 974 FrameStateInfo state_info = OpParameter<FrameStateInfo>(frame_state);
973 int argument_count = state_info.parameter_count() - 1; // Minus receiver. 975 int argument_count = state_info.parameter_count() - 1; // Minus receiver.
974 if (argument_count == 0) return jsgraph()->EmptyFixedArrayConstant(); 976 if (argument_count == 0) return jsgraph()->EmptyFixedArrayConstant();
975 977
976 // If there is no aliasing, the arguments object elements are not special in 978 // If there is no aliasing, the arguments object elements are not special in
977 // any way, we can just return an unmapped backing store instead. 979 // any way, we can just return an unmapped backing store instead.
978 int parameter_count = shared->internal_formal_parameter_count(); 980 int parameter_count = shared->internal_formal_parameter_count();
979 if (parameter_count == 0) { 981 if (parameter_count == 0) {
980 return AllocateArguments(effect, control, frame_state); 982 return AllocateArguments(effect, control, frame_state);
981 } 983 }
982 984
983 // Calculate number of argument values being aliased/mapped. 985 // Calculate number of argument values being aliased/mapped.
984 int mapped_count = Min(argument_count, parameter_count); 986 int mapped_count = Min(argument_count, parameter_count);
985 *has_aliased_arguments = true; 987 *has_aliased_arguments = true;
986 988
987 // Prepare an iterator over argument values recorded in the frame state. 989 // Prepare an iterator over argument values recorded in the frame state.
988 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput); 990 Node* const parameters = frame_state->InputAt(kFrameStateParametersInput);
989 StateValuesAccess parameters_access(parameters); 991 StateValuesAccess parameters_access(parameters);
990 auto paratemers_it = ++parameters_access.begin(); 992 auto parameters_it = ++parameters_access.begin();
991 993
992 // The unmapped argument values recorded in the frame state are stored yet 994 // The unmapped argument values recorded in the frame state are stored yet
993 // another indirection away and then linked into the parameter map below, 995 // another indirection away and then linked into the parameter map below,
994 // whereas mapped argument values are replaced with a hole instead. 996 // whereas mapped argument values are replaced with a hole instead.
995 AllocationBuilder aa(jsgraph(), effect, control); 997 AllocationBuilder aa(jsgraph(), effect, control);
996 aa.AllocateArray(argument_count, factory()->fixed_array_map()); 998 aa.AllocateArray(argument_count, factory()->fixed_array_map());
997 for (int i = 0; i < mapped_count; ++i, ++paratemers_it) { 999 for (int i = 0; i < mapped_count; ++i, ++parameters_it) {
998 aa.Store(AccessBuilder::ForFixedArraySlot(i), jsgraph()->TheHoleConstant()); 1000 aa.Store(AccessBuilder::ForFixedArraySlot(i), jsgraph()->TheHoleConstant());
999 } 1001 }
1000 for (int i = mapped_count; i < argument_count; ++i, ++paratemers_it) { 1002 for (int i = mapped_count; i < argument_count; ++i, ++parameters_it) {
1001 aa.Store(AccessBuilder::ForFixedArraySlot(i), (*paratemers_it).node); 1003 DCHECK_NOT_NULL((*parameters_it).node);
1004 aa.Store(AccessBuilder::ForFixedArraySlot(i), (*parameters_it).node);
1002 } 1005 }
1003 Node* arguments = aa.Finish(); 1006 Node* arguments = aa.Finish();
1004 1007
1005 // Actually allocate the backing store. 1008 // Actually allocate the backing store.
1006 AllocationBuilder a(jsgraph(), arguments, control); 1009 AllocationBuilder a(jsgraph(), arguments, control);
1007 a.AllocateArray(mapped_count + 2, factory()->sloppy_arguments_elements_map()); 1010 a.AllocateArray(mapped_count + 2, factory()->sloppy_arguments_elements_map());
1008 a.Store(AccessBuilder::ForFixedArraySlot(0), context); 1011 a.Store(AccessBuilder::ForFixedArraySlot(0), context);
1009 a.Store(AccessBuilder::ForFixedArraySlot(1), arguments); 1012 a.Store(AccessBuilder::ForFixedArraySlot(1), arguments);
1010 for (int i = 0; i < mapped_count; ++i) { 1013 for (int i = 0; i < mapped_count; ++i) {
1011 int idx = Context::MIN_CONTEXT_SLOTS + parameter_count - 1 - i; 1014 int idx = Context::MIN_CONTEXT_SLOTS + parameter_count - 1 - i;
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 return jsgraph()->simplified(); 1287 return jsgraph()->simplified();
1285 } 1288 }
1286 1289
1287 MachineOperatorBuilder* JSCreateLowering::machine() const { 1290 MachineOperatorBuilder* JSCreateLowering::machine() const {
1288 return jsgraph()->machine(); 1291 return jsgraph()->machine();
1289 } 1292 }
1290 1293
1291 } // namespace compiler 1294 } // namespace compiler
1292 } // namespace internal 1295 } // namespace internal
1293 } // namespace v8 1296 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698