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

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

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

Powered by Google App Engine
This is Rietveld 408576698