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

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

Issue 1513543003: [turbofan] Make MachineType a pair of enums. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Moar rebase Created 5 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/js-native-context-specialization.cc ('k') | src/compiler/linkage.h » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/compilation-dependencies.h" 6 #include "src/compilation-dependencies.h"
7 #include "src/compiler/access-builder.h" 7 #include "src/compiler/access-builder.h"
8 #include "src/compiler/js-graph.h" 8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/js-typed-lowering.h" 9 #include "src/compiler/js-typed-lowering.h"
10 #include "src/compiler/linkage.h" 10 #include "src/compiler/linkage.h"
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 Node* left_exception = 377 Node* left_exception =
378 graph()->NewNode(common()->IfException(hint), left_conv, left_conv); 378 graph()->NewNode(common()->IfException(hint), left_conv, left_conv);
379 Node* right_exception = 379 Node* right_exception =
380 graph()->NewNode(common()->IfException(hint), right_conv, right_conv); 380 graph()->NewNode(common()->IfException(hint), right_conv, right_conv);
381 NodeProperties::ReplaceControlInput(if_success, right_conv); 381 NodeProperties::ReplaceControlInput(if_success, right_conv);
382 update_effect(right_conv); 382 update_effect(right_conv);
383 383
384 // Wire conversions to existing {IfException} continuation. 384 // Wire conversions to existing {IfException} continuation.
385 Node* exception_merge = if_exception; 385 Node* exception_merge = if_exception;
386 Node* exception_value = 386 Node* exception_value =
387 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), left_exception, 387 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
388 right_exception, exception_merge); 388 left_exception, right_exception, exception_merge);
389 Node* exception_effect = 389 Node* exception_effect =
390 graph()->NewNode(common()->EffectPhi(2), left_exception, 390 graph()->NewNode(common()->EffectPhi(2), left_exception,
391 right_exception, exception_merge); 391 right_exception, exception_merge);
392 for (Edge edge : exception_merge->use_edges()) { 392 for (Edge edge : exception_merge->use_edges()) {
393 if (NodeProperties::IsEffectEdge(edge)) edge.UpdateTo(exception_effect); 393 if (NodeProperties::IsEffectEdge(edge)) edge.UpdateTo(exception_effect);
394 if (NodeProperties::IsValueEdge(edge)) edge.UpdateTo(exception_value); 394 if (NodeProperties::IsValueEdge(edge)) edge.UpdateTo(exception_value);
395 } 395 }
396 NodeProperties::RemoveType(exception_merge); 396 NodeProperties::RemoveType(exception_merge);
397 exception_merge->ReplaceInput(0, left_exception); 397 exception_merge->ReplaceInput(0, left_exception);
398 exception_merge->ReplaceInput(1, right_exception); 398 exception_merge->ReplaceInput(1, right_exception);
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 // Recursively try to reduce the input first. 822 // Recursively try to reduce the input first.
823 Reduction result = ReduceJSToString(input); 823 Reduction result = ReduceJSToString(input);
824 if (result.Changed()) return result; 824 if (result.Changed()) return result;
825 return Changed(input); // JSToString(JSToString(x)) => JSToString(x) 825 return Changed(input); // JSToString(JSToString(x)) => JSToString(x)
826 } 826 }
827 Type* input_type = NodeProperties::GetType(input); 827 Type* input_type = NodeProperties::GetType(input);
828 if (input_type->Is(Type::String())) { 828 if (input_type->Is(Type::String())) {
829 return Changed(input); // JSToString(x:string) => x 829 return Changed(input); // JSToString(x:string) => x
830 } 830 }
831 if (input_type->Is(Type::Boolean())) { 831 if (input_type->Is(Type::Boolean())) {
832 return Replace( 832 return Replace(graph()->NewNode(
833 graph()->NewNode(common()->Select(kMachAnyTagged), input, 833 common()->Select(MachineRepresentation::kTagged), input,
834 jsgraph()->HeapConstant(factory()->true_string()), 834 jsgraph()->HeapConstant(factory()->true_string()),
835 jsgraph()->HeapConstant(factory()->false_string()))); 835 jsgraph()->HeapConstant(factory()->false_string())));
836 } 836 }
837 if (input_type->Is(Type::Undefined())) { 837 if (input_type->Is(Type::Undefined())) {
838 return Replace(jsgraph()->HeapConstant(factory()->undefined_string())); 838 return Replace(jsgraph()->HeapConstant(factory()->undefined_string()));
839 } 839 }
840 if (input_type->Is(Type::Null())) { 840 if (input_type->Is(Type::Null())) {
841 return Replace(jsgraph()->HeapConstant(factory()->null_string())); 841 return Replace(jsgraph()->HeapConstant(factory()->null_string()));
842 } 842 }
843 // TODO(turbofan): js-typed-lowering of ToString(x:number) 843 // TODO(turbofan): js-typed-lowering of ToString(x:number)
844 return NoChange(); 844 return NoChange();
845 } 845 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 receiver, context, frame_state, econvert, if_convert); 921 receiver, context, frame_state, econvert, if_convert);
922 } 922 }
923 923
924 // The {receiver} is already a spec object. 924 // The {receiver} is already a spec object.
925 Node* if_done = if_true1; 925 Node* if_done = if_true1;
926 Node* edone = etrue1; 926 Node* edone = etrue1;
927 Node* rdone = receiver; 927 Node* rdone = receiver;
928 928
929 control = graph()->NewNode(common()->Merge(2), if_convert, if_done); 929 control = graph()->NewNode(common()->Merge(2), if_convert, if_done);
930 effect = graph()->NewNode(common()->EffectPhi(2), econvert, edone, control); 930 effect = graph()->NewNode(common()->EffectPhi(2), econvert, edone, control);
931 receiver = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), rconvert, 931 receiver =
932 rdone, control); 932 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
933 rconvert, rdone, control);
933 } 934 }
934 ReplaceWithValue(node, receiver, effect, control); 935 ReplaceWithValue(node, receiver, effect, control);
935 return Changed(receiver); 936 return Changed(receiver);
936 } 937 }
937 938
938 939
939 Reduction JSTypedLowering::ReduceJSLoadNamed(Node* node) { 940 Reduction JSTypedLowering::ReduceJSLoadNamed(Node* node) {
940 DCHECK_EQ(IrOpcode::kJSLoadNamed, node->opcode()); 941 DCHECK_EQ(IrOpcode::kJSLoadNamed, node->opcode());
941 Node* receiver = NodeProperties::GetValueInput(node, 0); 942 Node* receiver = NodeProperties::GetValueInput(node, 0);
942 Type* receiver_type = NodeProperties::GetType(receiver); 943 Type* receiver_type = NodeProperties::GetType(receiver);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 Node* key = NodeProperties::GetValueInput(node, 1); 982 Node* key = NodeProperties::GetValueInput(node, 1);
982 Node* base = NodeProperties::GetValueInput(node, 0); 983 Node* base = NodeProperties::GetValueInput(node, 0);
983 Type* key_type = NodeProperties::GetType(key); 984 Type* key_type = NodeProperties::GetType(key);
984 HeapObjectMatcher mbase(base); 985 HeapObjectMatcher mbase(base);
985 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) { 986 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) {
986 Handle<JSTypedArray> const array = 987 Handle<JSTypedArray> const array =
987 Handle<JSTypedArray>::cast(mbase.Value()); 988 Handle<JSTypedArray>::cast(mbase.Value());
988 if (!array->GetBuffer()->was_neutered()) { 989 if (!array->GetBuffer()->was_neutered()) {
989 array->GetBuffer()->set_is_neuterable(false); 990 array->GetBuffer()->set_is_neuterable(false);
990 BufferAccess const access(array->type()); 991 BufferAccess const access(array->type());
991 size_t const k = ElementSizeLog2Of(access.machine_type()); 992 size_t const k =
993 ElementSizeLog2Of(access.machine_type().representation());
992 double const byte_length = array->byte_length()->Number(); 994 double const byte_length = array->byte_length()->Number();
993 CHECK_LT(k, arraysize(shifted_int32_ranges_)); 995 CHECK_LT(k, arraysize(shifted_int32_ranges_));
994 if (key_type->Is(shifted_int32_ranges_[k]) && byte_length <= kMaxInt) { 996 if (key_type->Is(shifted_int32_ranges_[k]) && byte_length <= kMaxInt) {
995 // JSLoadProperty(typed-array, int32) 997 // JSLoadProperty(typed-array, int32)
996 Handle<FixedTypedArrayBase> elements = 998 Handle<FixedTypedArrayBase> elements =
997 Handle<FixedTypedArrayBase>::cast(handle(array->elements())); 999 Handle<FixedTypedArrayBase>::cast(handle(array->elements()));
998 Node* buffer = jsgraph()->PointerConstant(elements->external_pointer()); 1000 Node* buffer = jsgraph()->PointerConstant(elements->external_pointer());
999 Node* length = jsgraph()->Constant(byte_length); 1001 Node* length = jsgraph()->Constant(byte_length);
1000 Node* effect = NodeProperties::GetEffectInput(node); 1002 Node* effect = NodeProperties::GetEffectInput(node);
1001 Node* control = NodeProperties::GetControlInput(node); 1003 Node* control = NodeProperties::GetControlInput(node);
(...skipping 25 matching lines...) Expand all
1027 Node* value = NodeProperties::GetValueInput(node, 2); 1029 Node* value = NodeProperties::GetValueInput(node, 2);
1028 Type* key_type = NodeProperties::GetType(key); 1030 Type* key_type = NodeProperties::GetType(key);
1029 Type* value_type = NodeProperties::GetType(value); 1031 Type* value_type = NodeProperties::GetType(value);
1030 HeapObjectMatcher mbase(base); 1032 HeapObjectMatcher mbase(base);
1031 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) { 1033 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) {
1032 Handle<JSTypedArray> const array = 1034 Handle<JSTypedArray> const array =
1033 Handle<JSTypedArray>::cast(mbase.Value()); 1035 Handle<JSTypedArray>::cast(mbase.Value());
1034 if (!array->GetBuffer()->was_neutered()) { 1036 if (!array->GetBuffer()->was_neutered()) {
1035 array->GetBuffer()->set_is_neuterable(false); 1037 array->GetBuffer()->set_is_neuterable(false);
1036 BufferAccess const access(array->type()); 1038 BufferAccess const access(array->type());
1037 size_t const k = ElementSizeLog2Of(access.machine_type()); 1039 size_t const k =
1040 ElementSizeLog2Of(access.machine_type().representation());
1038 double const byte_length = array->byte_length()->Number(); 1041 double const byte_length = array->byte_length()->Number();
1039 CHECK_LT(k, arraysize(shifted_int32_ranges_)); 1042 CHECK_LT(k, arraysize(shifted_int32_ranges_));
1040 if (access.external_array_type() != kExternalUint8ClampedArray && 1043 if (access.external_array_type() != kExternalUint8ClampedArray &&
1041 key_type->Is(shifted_int32_ranges_[k]) && byte_length <= kMaxInt) { 1044 key_type->Is(shifted_int32_ranges_[k]) && byte_length <= kMaxInt) {
1042 // JSLoadProperty(typed-array, int32) 1045 // JSLoadProperty(typed-array, int32)
1043 Handle<FixedTypedArrayBase> elements = 1046 Handle<FixedTypedArrayBase> elements =
1044 Handle<FixedTypedArrayBase>::cast(handle(array->elements())); 1047 Handle<FixedTypedArrayBase>::cast(handle(array->elements()));
1045 Node* buffer = jsgraph()->PointerConstant(elements->external_pointer()); 1048 Node* buffer = jsgraph()->PointerConstant(elements->external_pointer());
1046 Node* length = jsgraph()->Constant(byte_length); 1049 Node* length = jsgraph()->Constant(byte_length);
1047 Node* context = NodeProperties::GetContextInput(node); 1050 Node* context = NodeProperties::GetContextInput(node);
1048 Node* effect = NodeProperties::GetEffectInput(node); 1051 Node* effect = NodeProperties::GetEffectInput(node);
1049 Node* control = NodeProperties::GetControlInput(node); 1052 Node* control = NodeProperties::GetControlInput(node);
1050 // Convert to a number first. 1053 // Convert to a number first.
1051 if (!value_type->Is(Type::Number())) { 1054 if (!value_type->Is(Type::Number())) {
1052 Reduction number_reduction = ReduceJSToNumberInput(value); 1055 Reduction number_reduction = ReduceJSToNumberInput(value);
1053 if (number_reduction.Changed()) { 1056 if (number_reduction.Changed()) {
1054 value = number_reduction.replacement(); 1057 value = number_reduction.replacement();
1055 } else { 1058 } else {
1056 Node* frame_state_for_to_number = 1059 Node* frame_state_for_to_number =
1057 NodeProperties::GetFrameStateInput(node, 1); 1060 NodeProperties::GetFrameStateInput(node, 1);
1058 value = effect = 1061 value = effect =
1059 graph()->NewNode(javascript()->ToNumber(), value, context, 1062 graph()->NewNode(javascript()->ToNumber(), value, context,
1060 frame_state_for_to_number, effect, control); 1063 frame_state_for_to_number, effect, control);
1061 } 1064 }
1062 } 1065 }
1063 // For integer-typed arrays, convert to the integer type. 1066 // For integer-typed arrays, convert to the integer type.
1064 if (TypeOf(access.machine_type()) == kTypeInt32 && 1067 if (access.machine_type().semantic() == MachineSemantic::kInt32 &&
1065 !value_type->Is(Type::Signed32())) { 1068 !value_type->Is(Type::Signed32())) {
1066 value = graph()->NewNode(simplified()->NumberToInt32(), value); 1069 value = graph()->NewNode(simplified()->NumberToInt32(), value);
1067 } else if (TypeOf(access.machine_type()) == kTypeUint32 && 1070 } else if (access.machine_type().semantic() ==
1071 MachineSemantic::kUint32 &&
1068 !value_type->Is(Type::Unsigned32())) { 1072 !value_type->Is(Type::Unsigned32())) {
1069 value = graph()->NewNode(simplified()->NumberToUint32(), value); 1073 value = graph()->NewNode(simplified()->NumberToUint32(), value);
1070 } 1074 }
1071 // Check if we can avoid the bounds check. 1075 // Check if we can avoid the bounds check.
1072 if (key_type->Min() >= 0 && key_type->Max() < array->length_value()) { 1076 if (key_type->Min() >= 0 && key_type->Max() < array->length_value()) {
1073 RelaxControls(node); 1077 RelaxControls(node);
1074 node->ReplaceInput(0, buffer); 1078 node->ReplaceInput(0, buffer);
1075 DCHECK_EQ(key, node->InputAt(1)); 1079 DCHECK_EQ(key, node->InputAt(1));
1076 node->ReplaceInput(2, value); 1080 node->ReplaceInput(2, value);
1077 node->ReplaceInput(3, effect); 1081 node->ReplaceInput(3, effect);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), 1147 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()),
1144 r.left(), effect, control); 1148 r.left(), effect, control);
1145 1149
1146 // Loop through the {object}s prototype chain looking for the {prototype}. 1150 // Loop through the {object}s prototype chain looking for the {prototype}.
1147 Node* loop = control = 1151 Node* loop = control =
1148 graph()->NewNode(common()->Loop(2), control, control); 1152 graph()->NewNode(common()->Loop(2), control, control);
1149 1153
1150 Node* loop_effect = effect = 1154 Node* loop_effect = effect =
1151 graph()->NewNode(common()->EffectPhi(2), effect, effect, loop); 1155 graph()->NewNode(common()->EffectPhi(2), effect, effect, loop);
1152 1156
1153 Node* loop_object_map = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), 1157 Node* loop_object_map =
1154 object_map, r.left(), loop); 1158 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
1159 object_map, r.left(), loop);
1155 1160
1156 1161
1157 Node* object_prototype = effect = graph()->NewNode( 1162 Node* object_prototype = effect = graph()->NewNode(
1158 simplified()->LoadField(AccessBuilder::ForMapPrototype()), 1163 simplified()->LoadField(AccessBuilder::ForMapPrototype()),
1159 loop_object_map, loop_effect, control); 1164 loop_object_map, loop_effect, control);
1160 1165
1161 // Check if object prototype is equal to function prototype. 1166 // Check if object prototype is equal to function prototype.
1162 Node* eq_proto = 1167 Node* eq_proto =
1163 graph()->NewNode(simplified()->ReferenceEqual(r.right_type()), 1168 graph()->NewNode(simplified()->ReferenceEqual(r.right_type()),
1164 object_prototype, prototype); 1169 object_prototype, prototype);
(...skipping 22 matching lines...) Expand all
1187 loop_effect->ReplaceInput(1, effect); 1192 loop_effect->ReplaceInput(1, effect);
1188 loop_object_map->ReplaceInput(1, load_object_map); 1193 loop_object_map->ReplaceInput(1, load_object_map);
1189 loop->ReplaceInput(1, control); 1194 loop->ReplaceInput(1, control);
1190 1195
1191 control = 1196 control =
1192 graph()->NewNode(common()->Merge(2), if_eq_proto, if_null_proto); 1197 graph()->NewNode(common()->Merge(2), if_eq_proto, if_null_proto);
1193 effect = graph()->NewNode(common()->EffectPhi(2), e_eq_proto, 1198 effect = graph()->NewNode(common()->EffectPhi(2), e_eq_proto,
1194 e_null_proto, control); 1199 e_null_proto, control);
1195 1200
1196 1201
1197 Node* result = graph()->NewNode(common()->Phi(kTypeBool, 2), 1202 Node* result = graph()->NewNode(
1198 jsgraph()->TrueConstant(), 1203 common()->Phi(MachineRepresentation::kTagged, 2),
1199 jsgraph()->FalseConstant(), control); 1204 jsgraph()->TrueConstant(), jsgraph()->FalseConstant(), control);
1200 1205
1201 if (if_is_smi != nullptr) { 1206 if (if_is_smi != nullptr) {
1202 DCHECK(e_is_smi != nullptr); 1207 DCHECK(e_is_smi != nullptr);
1203 control = graph()->NewNode(common()->Merge(2), if_is_smi, control); 1208 control = graph()->NewNode(common()->Merge(2), if_is_smi, control);
1204 effect = 1209 effect =
1205 graph()->NewNode(common()->EffectPhi(2), e_is_smi, effect, control); 1210 graph()->NewNode(common()->EffectPhi(2), e_is_smi, effect, control);
1206 result = graph()->NewNode(common()->Phi(kTypeBool, 2), 1211 result =
1207 jsgraph()->FalseConstant(), result, control); 1212 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
1213 jsgraph()->FalseConstant(), result, control);
1208 } 1214 }
1209 ReplaceWithValue(node, result, effect, control); 1215 ReplaceWithValue(node, result, effect, control);
1210 return Changed(result); 1216 return Changed(result);
1211 } 1217 }
1212 } 1218 }
1213 1219
1214 return NoChange(); 1220 return NoChange();
1215 } 1221 }
1216 1222
1217 1223
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 context, context, eglobal); 1342 context, context, eglobal);
1337 rglobal = eglobal = graph()->NewNode( 1343 rglobal = eglobal = graph()->NewNode(
1338 javascript()->LoadContext(0, Context::GLOBAL_PROXY_INDEX, true), 1344 javascript()->LoadContext(0, Context::GLOBAL_PROXY_INDEX, true),
1339 native_context, native_context, eglobal); 1345 native_context, native_context, eglobal);
1340 } 1346 }
1341 } 1347 }
1342 1348
1343 control = graph()->NewNode(common()->Merge(2), if_convert, if_global); 1349 control = graph()->NewNode(common()->Merge(2), if_convert, if_global);
1344 effect = 1350 effect =
1345 graph()->NewNode(common()->EffectPhi(2), econvert, eglobal, control); 1351 graph()->NewNode(common()->EffectPhi(2), econvert, eglobal, control);
1346 receiver = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), rconvert, 1352 receiver =
1347 rglobal, control); 1353 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
1354 rconvert, rglobal, control);
1348 } 1355 }
1349 } 1356 }
1350 ReplaceWithValue(node, receiver, effect, control); 1357 ReplaceWithValue(node, receiver, effect, control);
1351 return Changed(receiver); 1358 return Changed(receiver);
1352 } 1359 }
1353 1360
1354 1361
1355 namespace { 1362 namespace {
1356 1363
1357 // Maximum instance size for which allocations will be inlined. 1364 // Maximum instance size for which allocations will be inlined.
(...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after
2205 cache_array_false1 = efalse1 = graph()->NewNode( 2212 cache_array_false1 = efalse1 = graph()->NewNode(
2206 simplified()->LoadField( 2213 simplified()->LoadField(
2207 AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache()), 2214 AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache()),
2208 object_map_enum_cache, efalse1, if_false1); 2215 object_map_enum_cache, efalse1, if_false1);
2209 } 2216 }
2210 2217
2211 if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1); 2218 if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
2212 etrue0 = 2219 etrue0 =
2213 graph()->NewNode(common()->EffectPhi(2), etrue1, efalse1, if_true0); 2220 graph()->NewNode(common()->EffectPhi(2), etrue1, efalse1, if_true0);
2214 cache_array_true0 = 2221 cache_array_true0 =
2215 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), cache_array_true1, 2222 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
2216 cache_array_false1, if_true0); 2223 cache_array_true1, cache_array_false1, if_true0);
2217 2224
2218 cache_type_true0 = cache_type; 2225 cache_type_true0 = cache_type;
2219 } 2226 }
2220 2227
2221 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); 2228 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
2222 Node* cache_array_false0; 2229 Node* cache_array_false0;
2223 Node* cache_length_false0; 2230 Node* cache_length_false0;
2224 Node* cache_type_false0; 2231 Node* cache_type_false0;
2225 Node* efalse0; 2232 Node* efalse0;
2226 { 2233 {
2227 // FixedArray case. 2234 // FixedArray case.
2228 Node* receiver_instance_type = efalse0 = graph()->NewNode( 2235 Node* receiver_instance_type = efalse0 = graph()->NewNode(
2229 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), 2236 simplified()->LoadField(AccessBuilder::ForMapInstanceType()),
2230 receiver_map, effect, if_false0); 2237 receiver_map, effect, if_false0);
2231 2238
2232 cache_type_false0 = graph()->NewNode( 2239 cache_type_false0 = graph()->NewNode(
2233 common()->Select(kMachAnyTagged, BranchHint::kFalse), 2240 common()->Select(MachineRepresentation::kTagged, BranchHint::kFalse),
2234 graph()->NewNode(machine()->Word32Equal(), receiver_instance_type, 2241 graph()->NewNode(machine()->Word32Equal(), receiver_instance_type,
2235 jsgraph()->Uint32Constant(JS_PROXY_TYPE)), 2242 jsgraph()->Uint32Constant(JS_PROXY_TYPE)),
2236 jsgraph()->ZeroConstant(), // Zero indicagtes proxy. 2243 jsgraph()->ZeroConstant(), // Zero indicagtes proxy.
2237 jsgraph()->OneConstant()); // One means slow check. 2244 jsgraph()->OneConstant()); // One means slow check.
2238 2245
2239 cache_array_false0 = cache_type; 2246 cache_array_false0 = cache_type;
2240 cache_length_false0 = efalse0 = graph()->NewNode( 2247 cache_length_false0 = efalse0 = graph()->NewNode(
2241 simplified()->LoadField(AccessBuilder::ForFixedArrayLength()), 2248 simplified()->LoadField(AccessBuilder::ForFixedArrayLength()),
2242 cache_array_false0, efalse0, if_false0); 2249 cache_array_false0, efalse0, if_false0);
2243 } 2250 }
2244 2251
2245 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); 2252 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
2246 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); 2253 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control);
2247 Node* cache_array = 2254 Node* cache_array =
2248 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), cache_array_true0, 2255 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
2249 cache_array_false0, control); 2256 cache_array_true0, cache_array_false0, control);
2250 Node* cache_length = 2257 Node* cache_length =
2251 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), cache_length_true0, 2258 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
2252 cache_length_false0, control); 2259 cache_length_true0, cache_length_false0, control);
2253 cache_type = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), 2260 cache_type =
2254 cache_type_true0, cache_type_false0, control); 2261 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
2262 cache_type_true0, cache_type_false0, control);
2255 2263
2256 for (auto edge : node->use_edges()) { 2264 for (auto edge : node->use_edges()) {
2257 Node* const use = edge.from(); 2265 Node* const use = edge.from();
2258 if (NodeProperties::IsEffectEdge(edge)) { 2266 if (NodeProperties::IsEffectEdge(edge)) {
2259 edge.UpdateTo(effect); 2267 edge.UpdateTo(effect);
2260 Revisit(use); 2268 Revisit(use);
2261 } else { 2269 } else {
2262 if (NodeProperties::IsControlEdge(edge)) { 2270 if (NodeProperties::IsControlEdge(edge)) {
2263 if (use->opcode() == IrOpcode::kIfSuccess) { 2271 if (use->opcode() == IrOpcode::kIfSuccess) {
2264 Replace(use, control); 2272 Replace(use, control);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2357 // {receiver} (does the ToName conversion implicitly). 2365 // {receiver} (does the ToName conversion implicitly).
2358 vfalse1 = efalse1 = graph()->NewNode( 2366 vfalse1 = efalse1 = graph()->NewNode(
2359 javascript()->CallRuntime(Runtime::kForInFilter, 2), receiver, key, 2367 javascript()->CallRuntime(Runtime::kForInFilter, 2), receiver, key,
2360 context, frame_state, effect, if_false1); 2368 context, frame_state, effect, if_false1);
2361 if_false1 = graph()->NewNode(common()->IfSuccess(), vfalse1); 2369 if_false1 = graph()->NewNode(common()->IfSuccess(), vfalse1);
2362 } 2370 }
2363 2371
2364 if_false0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1); 2372 if_false0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
2365 efalse0 = 2373 efalse0 =
2366 graph()->NewNode(common()->EffectPhi(2), etrue1, efalse1, if_false0); 2374 graph()->NewNode(common()->EffectPhi(2), etrue1, efalse1, if_false0);
2367 vfalse0 = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), vtrue1, 2375 vfalse0 = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
2368 vfalse1, if_false0); 2376 vtrue1, vfalse1, if_false0);
2369 } 2377 }
2370 2378
2371 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); 2379 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
2372 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); 2380 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control);
2373 ReplaceWithValue(node, node, effect, control); 2381 ReplaceWithValue(node, node, effect, control);
2374 node->ReplaceInput(0, vtrue0); 2382 node->ReplaceInput(0, vtrue0);
2375 node->ReplaceInput(1, vfalse0); 2383 node->ReplaceInput(1, vfalse0);
2376 node->ReplaceInput(2, control); 2384 node->ReplaceInput(2, control);
2377 node->TrimInputCount(3); 2385 node->TrimInputCount(3);
2378 NodeProperties::ChangeOp(node, common()->Phi(kMachAnyTagged, 2)); 2386 NodeProperties::ChangeOp(node,
2387 common()->Phi(MachineRepresentation::kTagged, 2));
2379 return Changed(node); 2388 return Changed(node);
2380 } 2389 }
2381 2390
2382 2391
2383 Reduction JSTypedLowering::ReduceJSForInStep(Node* node) { 2392 Reduction JSTypedLowering::ReduceJSForInStep(Node* node) {
2384 DCHECK_EQ(IrOpcode::kJSForInStep, node->opcode()); 2393 DCHECK_EQ(IrOpcode::kJSForInStep, node->opcode());
2385 node->ReplaceInput(1, jsgraph()->Int32Constant(1)); 2394 node->ReplaceInput(1, jsgraph()->Int32Constant(1));
2386 NodeProperties::ChangeOp(node, machine()->Int32Add()); 2395 NodeProperties::ChangeOp(node, machine()->Int32Add());
2387 return Changed(node); 2396 return Changed(node);
2388 } 2397 }
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
2689 } 2698 }
2690 2699
2691 2700
2692 CompilationDependencies* JSTypedLowering::dependencies() const { 2701 CompilationDependencies* JSTypedLowering::dependencies() const {
2693 return dependencies_; 2702 return dependencies_;
2694 } 2703 }
2695 2704
2696 } // namespace compiler 2705 } // namespace compiler
2697 } // namespace internal 2706 } // namespace internal
2698 } // namespace v8 2707 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/js-native-context-specialization.cc ('k') | src/compiler/linkage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698