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 |