| 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 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 | 1038 |
| 1039 | 1039 |
| 1040 HValue* HGraphBuilder::BuildCheckHeapObject(HValue* obj) { | 1040 HValue* HGraphBuilder::BuildCheckHeapObject(HValue* obj) { |
| 1041 if (obj->type().IsHeapObject()) return obj; | 1041 if (obj->type().IsHeapObject()) return obj; |
| 1042 return Add<HCheckHeapObject>(obj); | 1042 return Add<HCheckHeapObject>(obj); |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 | 1045 |
| 1046 HValue* HGraphBuilder::BuildCheckMap(HValue* obj, | 1046 HValue* HGraphBuilder::BuildCheckMap(HValue* obj, |
| 1047 Handle<Map> map) { | 1047 Handle<Map> map) { |
| 1048 HCheckMaps* check = HCheckMaps::New(obj, map, zone()); | 1048 HCheckMaps* check = HCheckMaps::New(obj, map, zone(), top_info()); |
| 1049 AddInstruction(check); | 1049 AddInstruction(check); |
| 1050 return check; | 1050 return check; |
| 1051 } | 1051 } |
| 1052 | 1052 |
| 1053 | 1053 |
| 1054 HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, | 1054 HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
| 1055 HValue* elements, | 1055 HValue* elements, |
| 1056 ElementsKind kind, | 1056 ElementsKind kind, |
| 1057 HValue* length, | 1057 HValue* length, |
| 1058 HValue* key, | 1058 HValue* key, |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 if (mapcheck != NULL) { | 1201 if (mapcheck != NULL) { |
| 1202 mapcheck->ClearGVNFlag(kDependsOnElementsKind); | 1202 mapcheck->ClearGVNFlag(kDependsOnElementsKind); |
| 1203 } | 1203 } |
| 1204 } | 1204 } |
| 1205 bool fast_smi_only_elements = IsFastSmiElementsKind(elements_kind); | 1205 bool fast_smi_only_elements = IsFastSmiElementsKind(elements_kind); |
| 1206 bool fast_elements = IsFastObjectElementsKind(elements_kind); | 1206 bool fast_elements = IsFastObjectElementsKind(elements_kind); |
| 1207 HValue* elements = AddLoadElements(object, mapcheck); | 1207 HValue* elements = AddLoadElements(object, mapcheck); |
| 1208 if (is_store && (fast_elements || fast_smi_only_elements) && | 1208 if (is_store && (fast_elements || fast_smi_only_elements) && |
| 1209 store_mode != STORE_NO_TRANSITION_HANDLE_COW) { | 1209 store_mode != STORE_NO_TRANSITION_HANDLE_COW) { |
| 1210 HCheckMaps* check_cow_map = HCheckMaps::New( | 1210 HCheckMaps* check_cow_map = HCheckMaps::New( |
| 1211 elements, isolate()->factory()->fixed_array_map(), zone); | 1211 elements, isolate()->factory()->fixed_array_map(), zone, top_info()); |
| 1212 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); | 1212 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
| 1213 AddInstruction(check_cow_map); | 1213 AddInstruction(check_cow_map); |
| 1214 } | 1214 } |
| 1215 HInstruction* length = NULL; | 1215 HInstruction* length = NULL; |
| 1216 if (is_js_array) { | 1216 if (is_js_array) { |
| 1217 length = AddLoad(object, HObjectAccess::ForArrayLength(), mapcheck, | 1217 length = AddLoad(object, HObjectAccess::ForArrayLength(), mapcheck, |
| 1218 Representation::Smi()); | 1218 Representation::Smi()); |
| 1219 } else { | 1219 } else { |
| 1220 length = AddLoadFixedArrayLength(elements); | 1220 length = AddLoadFixedArrayLength(elements); |
| 1221 } | 1221 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1269 checked_key = Add<HBoundsCheck>(key, length); | 1269 checked_key = Add<HBoundsCheck>(key, length); |
| 1270 | 1270 |
| 1271 if (is_store && (fast_elements || fast_smi_only_elements)) { | 1271 if (is_store && (fast_elements || fast_smi_only_elements)) { |
| 1272 if (store_mode == STORE_NO_TRANSITION_HANDLE_COW) { | 1272 if (store_mode == STORE_NO_TRANSITION_HANDLE_COW) { |
| 1273 NoObservableSideEffectsScope no_effects(this); | 1273 NoObservableSideEffectsScope no_effects(this); |
| 1274 | 1274 |
| 1275 elements = BuildCopyElementsOnWrite(object, elements, elements_kind, | 1275 elements = BuildCopyElementsOnWrite(object, elements, elements_kind, |
| 1276 length); | 1276 length); |
| 1277 } else { | 1277 } else { |
| 1278 HCheckMaps* check_cow_map = HCheckMaps::New( | 1278 HCheckMaps* check_cow_map = HCheckMaps::New( |
| 1279 elements, isolate()->factory()->fixed_array_map(), zone); | 1279 elements, isolate()->factory()->fixed_array_map(), |
| 1280 zone, top_info()); |
| 1280 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); | 1281 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
| 1281 AddInstruction(check_cow_map); | 1282 AddInstruction(check_cow_map); |
| 1282 } | 1283 } |
| 1283 } | 1284 } |
| 1284 } | 1285 } |
| 1285 return AddFastElementAccess(elements, checked_key, val, mapcheck, | 1286 return AddFastElementAccess(elements, checked_key, val, mapcheck, |
| 1286 elements_kind, is_store, load_mode, store_mode); | 1287 elements_kind, is_store, load_mode, store_mode); |
| 1287 } | 1288 } |
| 1288 | 1289 |
| 1289 | 1290 |
| (...skipping 3153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4443 Runtime::FunctionId function_id = (expr->depth() > 1) | 4444 Runtime::FunctionId function_id = (expr->depth() > 1) |
| 4444 ? Runtime::kCreateArrayLiteral : Runtime::kCreateArrayLiteralShallow; | 4445 ? Runtime::kCreateArrayLiteral : Runtime::kCreateArrayLiteralShallow; |
| 4445 literal = Add<HCallRuntime>(context, | 4446 literal = Add<HCallRuntime>(context, |
| 4446 isolate()->factory()->empty_string(), | 4447 isolate()->factory()->empty_string(), |
| 4447 Runtime::FunctionForId(function_id), | 4448 Runtime::FunctionForId(function_id), |
| 4448 3); | 4449 3); |
| 4449 | 4450 |
| 4450 // De-opt if elements kind changed from boilerplate_elements_kind. | 4451 // De-opt if elements kind changed from boilerplate_elements_kind. |
| 4451 Handle<Map> map = Handle<Map>(original_boilerplate_object->map(), | 4452 Handle<Map> map = Handle<Map>(original_boilerplate_object->map(), |
| 4452 isolate()); | 4453 isolate()); |
| 4453 AddInstruction(HCheckMaps::New(literal, map, zone())); | 4454 AddInstruction(HCheckMaps::New(literal, map, zone(), top_info())); |
| 4454 } | 4455 } |
| 4455 | 4456 |
| 4456 // The array is expected in the bailout environment during computation | 4457 // The array is expected in the bailout environment during computation |
| 4457 // of the property values and is the value of the entire expression. | 4458 // of the property values and is the value of the entire expression. |
| 4458 Push(literal); | 4459 Push(literal); |
| 4459 // The literal index is on the stack, too. | 4460 // The literal index is on the stack, too. |
| 4460 Push(Add<HConstant>(expr->literal_index())); | 4461 Push(Add<HConstant>(expr->literal_index())); |
| 4461 | 4462 |
| 4462 HInstruction* elements = NULL; | 4463 HInstruction* elements = NULL; |
| 4463 | 4464 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4534 int descriptor = transition->LastAdded(); | 4535 int descriptor = transition->LastAdded(); |
| 4535 PropertyDetails details = | 4536 PropertyDetails details = |
| 4536 transition->instance_descriptors()->GetDetails(descriptor); | 4537 transition->instance_descriptors()->GetDetails(descriptor); |
| 4537 return details.representation(); | 4538 return details.representation(); |
| 4538 } | 4539 } |
| 4539 } | 4540 } |
| 4540 | 4541 |
| 4541 | 4542 |
| 4542 void HOptimizedGraphBuilder::AddCheckMap(HValue* object, Handle<Map> map) { | 4543 void HOptimizedGraphBuilder::AddCheckMap(HValue* object, Handle<Map> map) { |
| 4543 BuildCheckHeapObject(object); | 4544 BuildCheckHeapObject(object); |
| 4544 AddInstruction(HCheckMaps::New(object, map, zone())); | 4545 AddInstruction(HCheckMaps::New(object, map, zone(), top_info())); |
| 4545 } | 4546 } |
| 4546 | 4547 |
| 4547 | 4548 |
| 4548 void HOptimizedGraphBuilder::AddCheckMapsWithTransitions(HValue* object, | 4549 void HOptimizedGraphBuilder::AddCheckMapsWithTransitions(HValue* object, |
| 4549 Handle<Map> map) { | 4550 Handle<Map> map) { |
| 4550 BuildCheckHeapObject(object); | 4551 BuildCheckHeapObject(object); |
| 4551 AddInstruction(HCheckMaps::NewWithTransitions(object, map, zone())); | 4552 AddInstruction(HCheckMaps::NewWithTransitions(object, map, zone())); |
| 4552 } | 4553 } |
| 4553 | 4554 |
| 4554 | 4555 |
| (...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5499 | 5500 |
| 5500 | 5501 |
| 5501 HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess( | 5502 HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess( |
| 5502 HValue* object, | 5503 HValue* object, |
| 5503 HValue* key, | 5504 HValue* key, |
| 5504 HValue* val, | 5505 HValue* val, |
| 5505 HValue* dependency, | 5506 HValue* dependency, |
| 5506 Handle<Map> map, | 5507 Handle<Map> map, |
| 5507 bool is_store, | 5508 bool is_store, |
| 5508 KeyedAccessStoreMode store_mode) { | 5509 KeyedAccessStoreMode store_mode) { |
| 5509 HCheckMaps* mapcheck = HCheckMaps::New(object, map, zone(), dependency); | 5510 HCheckMaps* mapcheck = HCheckMaps::New( |
| 5511 object, map, zone(), top_info(), dependency); |
| 5510 AddInstruction(mapcheck); | 5512 AddInstruction(mapcheck); |
| 5511 if (dependency) { | 5513 if (dependency) { |
| 5512 mapcheck->ClearGVNFlag(kDependsOnElementsKind); | 5514 mapcheck->ClearGVNFlag(kDependsOnElementsKind); |
| 5513 } | 5515 } |
| 5514 | 5516 |
| 5515 // Loads from a "stock" fast holey double arrays can elide the hole check. | 5517 // Loads from a "stock" fast holey double arrays can elide the hole check. |
| 5516 LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE; | 5518 LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE; |
| 5517 if (*map == isolate()->get_initial_js_array_map(FAST_HOLEY_DOUBLE_ELEMENTS) && | 5519 if (*map == isolate()->get_initial_js_array_map(FAST_HOLEY_DOUBLE_ELEMENTS) && |
| 5518 isolate()->IsFastArrayConstructorPrototypeChainIntact()) { | 5520 isolate()->IsFastArrayConstructorPrototypeChainIntact()) { |
| 5519 Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate()); | 5521 Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate()); |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5683 new(zone()) HCompareMap(object, map, this_map, other_map); | 5685 new(zone()) HCompareMap(object, map, this_map, other_map); |
| 5684 current_block()->Finish(mapcompare); | 5686 current_block()->Finish(mapcompare); |
| 5685 | 5687 |
| 5686 set_current_block(this_map); | 5688 set_current_block(this_map); |
| 5687 HInstruction* checked_key = NULL; | 5689 HInstruction* checked_key = NULL; |
| 5688 HInstruction* access = NULL; | 5690 HInstruction* access = NULL; |
| 5689 if (IsFastElementsKind(elements_kind)) { | 5691 if (IsFastElementsKind(elements_kind)) { |
| 5690 if (is_store && !IsFastDoubleElementsKind(elements_kind)) { | 5692 if (is_store && !IsFastDoubleElementsKind(elements_kind)) { |
| 5691 AddInstruction(HCheckMaps::New( | 5693 AddInstruction(HCheckMaps::New( |
| 5692 elements, isolate()->factory()->fixed_array_map(), | 5694 elements, isolate()->factory()->fixed_array_map(), |
| 5693 zone(), mapcompare)); | 5695 zone(), top_info(), mapcompare)); |
| 5694 } | 5696 } |
| 5695 if (map->IsJSArray()) { | 5697 if (map->IsJSArray()) { |
| 5696 HInstruction* length = AddLoad(object, HObjectAccess::ForArrayLength(), | 5698 HInstruction* length = AddLoad(object, HObjectAccess::ForArrayLength(), |
| 5697 mapcompare, Representation::Smi()); | 5699 mapcompare, Representation::Smi()); |
| 5698 length->set_type(HType::Smi()); | 5700 length->set_type(HType::Smi()); |
| 5699 checked_key = Add<HBoundsCheck>(key, length); | 5701 checked_key = Add<HBoundsCheck>(key, length); |
| 5700 } else { | 5702 } else { |
| 5701 HInstruction* length = AddLoadFixedArrayLength(elements); | 5703 HInstruction* length = AddLoadFixedArrayLength(elements); |
| 5702 checked_key = Add<HBoundsCheck>(key, length); | 5704 checked_key = Add<HBoundsCheck>(key, length); |
| 5703 } | 5705 } |
| (...skipping 4200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9904 if (ShouldProduceTraceOutput()) { | 9906 if (ShouldProduceTraceOutput()) { |
| 9905 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9907 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9906 } | 9908 } |
| 9907 | 9909 |
| 9908 #ifdef DEBUG | 9910 #ifdef DEBUG |
| 9909 graph_->Verify(false); // No full verify. | 9911 graph_->Verify(false); // No full verify. |
| 9910 #endif | 9912 #endif |
| 9911 } | 9913 } |
| 9912 | 9914 |
| 9913 } } // namespace v8::internal | 9915 } } // namespace v8::internal |
| OLD | NEW |