Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1212 array_length, elements_length); | 1212 array_length, elements_length); |
| 1213 | 1213 |
| 1214 if_builder.End(); | 1214 if_builder.End(); |
| 1215 } | 1215 } |
| 1216 | 1216 |
| 1217 Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map); | 1217 Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map); |
| 1218 } | 1218 } |
| 1219 | 1219 |
| 1220 | 1220 |
| 1221 HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( | 1221 HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
| 1222 HValue* object, | 1222 HValue* checked_object, |
| 1223 HValue* key, | 1223 HValue* key, |
| 1224 HValue* val, | 1224 HValue* val, |
| 1225 HCheckMaps* checked_object, | |
| 1226 bool is_js_array, | 1225 bool is_js_array, |
| 1227 ElementsKind elements_kind, | 1226 ElementsKind elements_kind, |
| 1228 bool is_store, | 1227 bool is_store, |
| 1229 LoadKeyedHoleMode load_mode, | 1228 LoadKeyedHoleMode load_mode, |
| 1230 KeyedAccessStoreMode store_mode) { | 1229 KeyedAccessStoreMode store_mode) { |
| 1231 ASSERT(!IsExternalArrayElementsKind(elements_kind) || !is_js_array); | 1230 ASSERT(!IsExternalArrayElementsKind(elements_kind) || !is_js_array); |
| 1232 // No GVNFlag is necessary for ElementsKind if there is an explicit dependency | 1231 // No GVNFlag is necessary for ElementsKind if there is an explicit dependency |
| 1233 // on a HElementsTransition instruction. The flag can also be removed if the | 1232 // on a HElementsTransition instruction. The flag can also be removed if the |
| 1234 // map to check has FAST_HOLEY_ELEMENTS, since there can be no further | 1233 // map to check has FAST_HOLEY_ELEMENTS, since there can be no further |
| 1235 // ElementsKind transitions. Finally, the dependency can be removed for stores | 1234 // ElementsKind transitions. Finally, the dependency can be removed for stores |
| 1236 // for FAST_ELEMENTS, since a transition to HOLEY elements won't change the | 1235 // for FAST_ELEMENTS, since a transition to HOLEY elements won't change the |
| 1237 // generated store code. | 1236 // generated store code. |
| 1238 if ((elements_kind == FAST_HOLEY_ELEMENTS) || | 1237 if ((elements_kind == FAST_HOLEY_ELEMENTS) || |
| 1239 (elements_kind == FAST_ELEMENTS && is_store)) { | 1238 (elements_kind == FAST_ELEMENTS && is_store)) { |
| 1240 if (checked_object != NULL) { | 1239 checked_object->ClearGVNFlag(kDependsOnElementsKind); |
| 1241 checked_object->ClearGVNFlag(kDependsOnElementsKind); | |
| 1242 } | |
| 1243 } | 1240 } |
| 1244 if (checked_object != NULL) object = checked_object; | 1241 |
| 1245 bool fast_smi_only_elements = IsFastSmiElementsKind(elements_kind); | 1242 bool fast_smi_only_elements = IsFastSmiElementsKind(elements_kind); |
| 1246 bool fast_elements = IsFastObjectElementsKind(elements_kind); | 1243 bool fast_elements = IsFastObjectElementsKind(elements_kind); |
| 1247 HValue* elements = AddLoadElements(object); | 1244 HValue* elements = AddLoadElements(checked_object); |
| 1248 if (is_store && (fast_elements || fast_smi_only_elements) && | 1245 if (is_store && (fast_elements || fast_smi_only_elements) && |
| 1249 store_mode != STORE_NO_TRANSITION_HANDLE_COW) { | 1246 store_mode != STORE_NO_TRANSITION_HANDLE_COW) { |
| 1250 HCheckMaps* check_cow_map = Add<HCheckMaps>( | 1247 HCheckMaps* check_cow_map = Add<HCheckMaps>( |
| 1251 elements, isolate()->factory()->fixed_array_map(), top_info()); | 1248 elements, isolate()->factory()->fixed_array_map(), top_info()); |
| 1252 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); | 1249 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
| 1253 } | 1250 } |
| 1254 HInstruction* length = NULL; | 1251 HInstruction* length = NULL; |
| 1255 if (is_js_array) { | 1252 if (is_js_array) { |
| 1256 length = Add<HLoadNamedField>( | 1253 length = Add<HLoadNamedField>( |
| 1257 object, HObjectAccess::ForArrayLength(elements_kind)); | 1254 checked_object, HObjectAccess::ForArrayLength(elements_kind)); |
| 1258 } else { | 1255 } else { |
| 1259 length = AddLoadFixedArrayLength(elements); | 1256 length = AddLoadFixedArrayLength(elements); |
| 1260 } | 1257 } |
| 1261 length->set_type(HType::Smi()); | 1258 length->set_type(HType::Smi()); |
| 1262 HValue* checked_key = NULL; | 1259 HValue* checked_key = NULL; |
| 1263 if (IsExternalArrayElementsKind(elements_kind)) { | 1260 if (IsExternalArrayElementsKind(elements_kind)) { |
| 1264 if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { | 1261 if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { |
| 1265 NoObservableSideEffectsScope no_effects(this); | 1262 NoObservableSideEffectsScope no_effects(this); |
| 1266 HLoadExternalArrayPointer* external_elements = | 1263 HLoadExternalArrayPointer* external_elements = |
| 1267 Add<HLoadExternalArrayPointer>(elements); | 1264 Add<HLoadExternalArrayPointer>(elements); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 1294 // In case val is stored into a fast smi array, assure that the value is a smi | 1291 // In case val is stored into a fast smi array, assure that the value is a smi |
| 1295 // before manipulating the backing store. Otherwise the actual store may | 1292 // before manipulating the backing store. Otherwise the actual store may |
| 1296 // deopt, leaving the backing store in an invalid state. | 1293 // deopt, leaving the backing store in an invalid state. |
| 1297 if (is_store && IsFastSmiElementsKind(elements_kind) && | 1294 if (is_store && IsFastSmiElementsKind(elements_kind) && |
| 1298 !val->type().IsSmi()) { | 1295 !val->type().IsSmi()) { |
| 1299 val = Add<HForceRepresentation>(val, Representation::Smi()); | 1296 val = Add<HForceRepresentation>(val, Representation::Smi()); |
| 1300 } | 1297 } |
| 1301 | 1298 |
| 1302 if (IsGrowStoreMode(store_mode)) { | 1299 if (IsGrowStoreMode(store_mode)) { |
| 1303 NoObservableSideEffectsScope no_effects(this); | 1300 NoObservableSideEffectsScope no_effects(this); |
| 1304 elements = BuildCheckForCapacityGrow(object, elements, elements_kind, | 1301 elements = BuildCheckForCapacityGrow(checked_object, elements, |
| 1305 length, key, is_js_array); | 1302 elements_kind, length, key, |
| 1303 is_js_array); | |
| 1306 checked_key = key; | 1304 checked_key = key; |
| 1307 } else { | 1305 } else { |
| 1308 checked_key = Add<HBoundsCheck>(key, length); | 1306 checked_key = Add<HBoundsCheck>(key, length); |
| 1309 | 1307 |
| 1310 if (is_store && (fast_elements || fast_smi_only_elements)) { | 1308 if (is_store && (fast_elements || fast_smi_only_elements)) { |
| 1311 if (store_mode == STORE_NO_TRANSITION_HANDLE_COW) { | 1309 if (store_mode == STORE_NO_TRANSITION_HANDLE_COW) { |
| 1312 NoObservableSideEffectsScope no_effects(this); | 1310 NoObservableSideEffectsScope no_effects(this); |
| 1313 | 1311 elements = BuildCopyElementsOnWrite(checked_object, elements, |
| 1314 elements = BuildCopyElementsOnWrite(object, elements, elements_kind, | 1312 elements_kind, length); |
| 1315 length); | |
| 1316 } else { | 1313 } else { |
| 1317 HCheckMaps* check_cow_map = Add<HCheckMaps>( | 1314 HCheckMaps* check_cow_map = Add<HCheckMaps>( |
| 1318 elements, isolate()->factory()->fixed_array_map(), | 1315 elements, isolate()->factory()->fixed_array_map(), |
| 1319 top_info()); | 1316 top_info()); |
| 1320 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); | 1317 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
| 1321 } | 1318 } |
| 1322 } | 1319 } |
| 1323 } | 1320 } |
| 1324 return AddFastElementAccess(elements, checked_key, val, checked_object, | 1321 return AddFastElementAccess(elements, checked_key, val, checked_object, |
| 1325 elements_kind, is_store, load_mode, store_mode); | 1322 elements_kind, is_store, load_mode, store_mode); |
| (...skipping 4168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5494 } | 5491 } |
| 5495 | 5492 |
| 5496 | 5493 |
| 5497 HInstruction* HOptimizedGraphBuilder::BuildLoadKeyedGeneric(HValue* object, | 5494 HInstruction* HOptimizedGraphBuilder::BuildLoadKeyedGeneric(HValue* object, |
| 5498 HValue* key) { | 5495 HValue* key) { |
| 5499 HValue* context = environment()->context(); | 5496 HValue* context = environment()->context(); |
| 5500 return new(zone()) HLoadKeyedGeneric(context, object, key); | 5497 return new(zone()) HLoadKeyedGeneric(context, object, key); |
| 5501 } | 5498 } |
| 5502 | 5499 |
| 5503 | 5500 |
| 5504 HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess( | 5501 LoadKeyedHoleMode HOptimizedGraphBuilder::BuildKeyedHoleMode(Handle<Map> map) { |
| 5505 HValue* object, | |
| 5506 HValue* key, | |
| 5507 HValue* val, | |
| 5508 HValue* dependency, | |
| 5509 Handle<Map> map, | |
| 5510 bool is_store, | |
| 5511 KeyedAccessStoreMode store_mode) { | |
| 5512 HCheckMaps* mapcheck = Add<HCheckMaps>(object, map, top_info(), dependency); | |
| 5513 if (dependency) { | |
| 5514 mapcheck->ClearGVNFlag(kDependsOnElementsKind); | |
| 5515 } | |
| 5516 | |
| 5517 // Loads from a "stock" fast holey double arrays can elide the hole check. | 5502 // Loads from a "stock" fast holey double arrays can elide the hole check. |
| 5518 LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE; | 5503 LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE; |
| 5519 if (*map == isolate()->get_initial_js_array_map(FAST_HOLEY_DOUBLE_ELEMENTS) && | 5504 if (*map == isolate()->get_initial_js_array_map(FAST_HOLEY_DOUBLE_ELEMENTS) && |
| 5520 isolate()->IsFastArrayConstructorPrototypeChainIntact()) { | 5505 isolate()->IsFastArrayConstructorPrototypeChainIntact()) { |
| 5521 Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate()); | 5506 Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate()); |
| 5522 Handle<JSObject> object_prototype = isolate()->initial_object_prototype(); | 5507 Handle<JSObject> object_prototype = isolate()->initial_object_prototype(); |
| 5523 BuildCheckPrototypeMaps(prototype, object_prototype); | 5508 BuildCheckPrototypeMaps(prototype, object_prototype); |
| 5524 load_mode = ALLOW_RETURN_HOLE; | 5509 load_mode = ALLOW_RETURN_HOLE; |
| 5525 graph()->MarkDependsOnEmptyArrayProtoElements(); | 5510 graph()->MarkDependsOnEmptyArrayProtoElements(); |
| 5526 } | 5511 } |
| 5527 | 5512 |
| 5528 return BuildUncheckedMonomorphicElementAccess( | 5513 return load_mode; |
| 5529 object, key, val, | |
| 5530 mapcheck, map->instance_type() == JS_ARRAY_TYPE, | |
| 5531 map->elements_kind(), is_store, load_mode, store_mode); | |
| 5532 } | 5514 } |
| 5533 | 5515 |
| 5534 | 5516 |
| 5517 HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess( | |
| 5518 HValue* object, | |
| 5519 HValue* key, | |
| 5520 HValue* val, | |
| 5521 HValue* dependency, | |
| 5522 Handle<Map> map, | |
| 5523 bool is_store, | |
| 5524 KeyedAccessStoreMode store_mode) { | |
| 5525 HCheckMaps* checked_object = Add<HCheckMaps>(object, map, top_info(), | |
| 5526 dependency); | |
| 5527 if (dependency) { | |
| 5528 checked_object->ClearGVNFlag(kDependsOnElementsKind); | |
| 5529 } | |
| 5530 | |
| 5531 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); | |
| 5532 return BuildUncheckedMonomorphicElementAccess( | |
| 5533 checked_object, key, val, | |
| 5534 map->instance_type() == JS_ARRAY_TYPE, | |
| 5535 map->elements_kind(), is_store, | |
| 5536 load_mode, store_mode); | |
| 5537 } | |
| 5538 | |
| 5539 | |
| 5535 HInstruction* HOptimizedGraphBuilder::TryBuildConsolidatedElementLoad( | 5540 HInstruction* HOptimizedGraphBuilder::TryBuildConsolidatedElementLoad( |
| 5536 HValue* object, | 5541 HValue* object, |
| 5537 HValue* key, | 5542 HValue* key, |
| 5538 HValue* val, | 5543 HValue* val, |
| 5539 SmallMapList* maps) { | 5544 SmallMapList* maps) { |
| 5540 // For polymorphic loads of similar elements kinds (i.e. all tagged or all | 5545 // For polymorphic loads of similar elements kinds (i.e. all tagged or all |
| 5541 // double), always use the "worst case" code without a transition. This is | 5546 // double), always use the "worst case" code without a transition. This is |
| 5542 // much faster than transitioning the elements to the worst case, trading a | 5547 // much faster than transitioning the elements to the worst case, trading a |
| 5543 // HTransitionElements for a HCheckMaps, and avoiding mutation of the array. | 5548 // HTransitionElements for a HCheckMaps, and avoiding mutation of the array. |
| 5544 bool has_double_maps = false; | 5549 bool has_double_maps = false; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 5575 // Remember the most general elements kind, the code for its load will | 5580 // Remember the most general elements kind, the code for its load will |
| 5576 // properly handle all of the more specific cases. | 5581 // properly handle all of the more specific cases. |
| 5577 if ((i == 0) || IsMoreGeneralElementsKindTransition( | 5582 if ((i == 0) || IsMoreGeneralElementsKindTransition( |
| 5578 most_general_consolidated_map->elements_kind(), | 5583 most_general_consolidated_map->elements_kind(), |
| 5579 map->elements_kind())) { | 5584 map->elements_kind())) { |
| 5580 most_general_consolidated_map = map; | 5585 most_general_consolidated_map = map; |
| 5581 } | 5586 } |
| 5582 } | 5587 } |
| 5583 if (!has_double_maps && !has_smi_or_object_maps) return NULL; | 5588 if (!has_double_maps && !has_smi_or_object_maps) return NULL; |
| 5584 | 5589 |
| 5585 HCheckMaps* check_maps = Add<HCheckMaps>(object, maps); | 5590 HCheckMaps* checked_object = Add<HCheckMaps>(object, maps); |
| 5586 // FAST_ELEMENTS is considered more general than FAST_HOLEY_SMI_ELEMENTS. | 5591 // FAST_ELEMENTS is considered more general than FAST_HOLEY_SMI_ELEMENTS. |
| 5587 // If we've seen both, the consolidated load must use FAST_HOLEY_ELEMENTS. | 5592 // If we've seen both, the consolidated load must use FAST_HOLEY_ELEMENTS. |
| 5588 ElementsKind consolidated_elements_kind = has_seen_holey_elements | 5593 ElementsKind consolidated_elements_kind = has_seen_holey_elements |
| 5589 ? GetHoleyElementsKind(most_general_consolidated_map->elements_kind()) | 5594 ? GetHoleyElementsKind(most_general_consolidated_map->elements_kind()) |
| 5590 : most_general_consolidated_map->elements_kind(); | 5595 : most_general_consolidated_map->elements_kind(); |
| 5591 HInstruction* instr = BuildUncheckedMonomorphicElementAccess( | 5596 HInstruction* instr = BuildUncheckedMonomorphicElementAccess( |
| 5592 object, key, val, check_maps, | 5597 checked_object, key, val, |
| 5593 most_general_consolidated_map->instance_type() == JS_ARRAY_TYPE, | 5598 most_general_consolidated_map->instance_type() == JS_ARRAY_TYPE, |
| 5594 consolidated_elements_kind, | 5599 consolidated_elements_kind, |
| 5595 false, NEVER_RETURN_HOLE, STANDARD_STORE); | 5600 false, NEVER_RETURN_HOLE, STANDARD_STORE); |
| 5596 return instr; | 5601 return instr; |
| 5597 } | 5602 } |
| 5598 | 5603 |
| 5599 | 5604 |
| 5600 HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( | 5605 HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
| 5601 HValue* object, | 5606 HValue* object, |
| 5602 HValue* key, | 5607 HValue* key, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5671 } else { | 5676 } else { |
| 5672 instr = BuildMonomorphicElementAccess( | 5677 instr = BuildMonomorphicElementAccess( |
| 5673 object, key, val, transition, untransitionable_map, is_store, | 5678 object, key, val, transition, untransitionable_map, is_store, |
| 5674 store_mode); | 5679 store_mode); |
| 5675 } | 5680 } |
| 5676 *has_side_effects |= instr->HasObservableSideEffects(); | 5681 *has_side_effects |= instr->HasObservableSideEffects(); |
| 5677 if (position != RelocInfo::kNoPosition) instr->set_position(position); | 5682 if (position != RelocInfo::kNoPosition) instr->set_position(position); |
| 5678 return is_store ? NULL : instr; | 5683 return is_store ? NULL : instr; |
| 5679 } | 5684 } |
| 5680 | 5685 |
| 5681 HInstruction* checked_object = | |
| 5682 AddInstruction(HCheckInstanceType::NewIsSpecObject(object, zone())); | |
| 5683 HBasicBlock* join = graph()->CreateBasicBlock(); | 5686 HBasicBlock* join = graph()->CreateBasicBlock(); |
| 5684 | 5687 |
| 5685 HInstruction* elements = AddLoadElements(checked_object); | |
| 5686 | |
| 5687 for (int i = 0; i < untransitionable_maps.length(); ++i) { | 5688 for (int i = 0; i < untransitionable_maps.length(); ++i) { |
| 5688 Handle<Map> map = untransitionable_maps[i]; | 5689 Handle<Map> map = untransitionable_maps[i]; |
| 5689 ElementsKind elements_kind = map->elements_kind(); | 5690 ElementsKind elements_kind = map->elements_kind(); |
| 5690 HBasicBlock* this_map = graph()->CreateBasicBlock(); | 5691 HBasicBlock* this_map = graph()->CreateBasicBlock(); |
| 5691 HBasicBlock* other_map = graph()->CreateBasicBlock(); | 5692 HBasicBlock* other_map = graph()->CreateBasicBlock(); |
| 5692 HCompareMap* mapcompare = | 5693 HCompareMap* mapcompare = |
| 5693 new(zone()) HCompareMap(object, map, this_map, other_map); | 5694 new(zone()) HCompareMap(object, map, this_map, other_map); |
| 5694 current_block()->Finish(mapcompare); | 5695 current_block()->Finish(mapcompare); |
| 5695 | 5696 |
| 5696 set_current_block(this_map); | 5697 set_current_block(this_map); |
| 5697 HInstruction* checked_key = NULL; | |
| 5698 HInstruction* access = NULL; | 5698 HInstruction* access = NULL; |
| 5699 if (IsFastElementsKind(elements_kind)) { | 5699 if (IsDictionaryElementsKind(elements_kind)) { |
| 5700 if (is_store && !IsFastDoubleElementsKind(elements_kind)) { | 5700 access = is_store |
| 5701 Add<HCheckMaps>( | 5701 ? AddInstruction(BuildStoreKeyedGeneric(object, key, val)) |
| 5702 elements, isolate()->factory()->fixed_array_map(), | 5702 : AddInstruction(BuildLoadKeyedGeneric(object, key)); |
| 5703 top_info(), mapcompare); | |
| 5704 } | |
| 5705 if (map->instance_type() == JS_ARRAY_TYPE) { | |
| 5706 HInstruction* length = Add<HLoadNamedField>( | |
| 5707 mapcompare, HObjectAccess::ForArrayLength(elements_kind)); | |
| 5708 checked_key = Add<HBoundsCheck>(key, length); | |
| 5709 } else { | |
| 5710 HInstruction* length = AddLoadFixedArrayLength(elements); | |
| 5711 checked_key = Add<HBoundsCheck>(key, length); | |
| 5712 } | |
| 5713 access = AddFastElementAccess( | |
| 5714 elements, checked_key, val, mapcompare, | |
| 5715 elements_kind, is_store, NEVER_RETURN_HOLE, STANDARD_STORE); | |
| 5716 } else if (IsDictionaryElementsKind(elements_kind)) { | |
| 5717 if (is_store) { | |
| 5718 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); | |
| 5719 } else { | |
| 5720 access = AddInstruction(BuildLoadKeyedGeneric(object, key)); | |
| 5721 } | |
| 5722 } else { | 5703 } else { |
| 5723 ASSERT(IsExternalArrayElementsKind(elements_kind)); | 5704 ASSERT(IsFastElementsKind(elements_kind) || |
| 5724 HInstruction* length = AddLoadFixedArrayLength(elements); | 5705 IsExternalArrayElementsKind(elements_kind)); |
| 5725 checked_key = Add<HBoundsCheck>(key, length); | 5706 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); |
| 5726 HLoadExternalArrayPointer* external_elements = | 5707 // mapcompare is a checked object |
|
Jakob Kummerow
2013/08/26 12:24:51
nit: Capitalization and punctuation, please.
mvstanton
2013/08/26 12:27:50
Done.
| |
| 5727 Add<HLoadExternalArrayPointer>(elements); | 5708 access = BuildUncheckedMonomorphicElementAccess( |
| 5728 access = AddExternalArrayElementAccess( | 5709 mapcompare, key, val, |
| 5729 external_elements, checked_key, val, | 5710 map->instance_type() == JS_ARRAY_TYPE, |
| 5730 mapcompare, elements_kind, is_store); | 5711 elements_kind, is_store, |
| 5712 load_mode, | |
| 5713 store_mode); | |
| 5731 } | 5714 } |
| 5732 *has_side_effects |= access->HasObservableSideEffects(); | 5715 *has_side_effects |= access->HasObservableSideEffects(); |
| 5733 // The caller will use has_side_effects and add a correct Simulate. | 5716 // The caller will use has_side_effects and add a correct Simulate. |
| 5734 access->SetFlag(HValue::kHasNoObservableSideEffects); | 5717 access->SetFlag(HValue::kHasNoObservableSideEffects); |
| 5735 if (position != RelocInfo::kNoPosition) access->set_position(position); | 5718 if (position != RelocInfo::kNoPosition) access->set_position(position); |
| 5736 if (!is_store) { | 5719 if (!is_store) { |
| 5737 Push(access); | 5720 Push(access); |
| 5738 } | 5721 } |
| 5739 NoObservableSideEffectsScope scope(this); | 5722 NoObservableSideEffectsScope scope(this); |
| 5740 current_block()->GotoNoSimulate(join); | 5723 current_block()->GotoNoSimulate(join); |
| (...skipping 4125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9866 if (ShouldProduceTraceOutput()) { | 9849 if (ShouldProduceTraceOutput()) { |
| 9867 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9850 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9868 } | 9851 } |
| 9869 | 9852 |
| 9870 #ifdef DEBUG | 9853 #ifdef DEBUG |
| 9871 graph_->Verify(false); // No full verify. | 9854 graph_->Verify(false); // No full verify. |
| 9872 #endif | 9855 #endif |
| 9873 } | 9856 } |
| 9874 | 9857 |
| 9875 } } // namespace v8::internal | 9858 } } // namespace v8::internal |
| OLD | NEW |