| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/hydrogen.h" | 5 #include "src/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 2370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2381 | 2381 |
| 2382 HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( | 2382 HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
| 2383 HValue* checked_object, | 2383 HValue* checked_object, |
| 2384 HValue* key, | 2384 HValue* key, |
| 2385 HValue* val, | 2385 HValue* val, |
| 2386 bool is_js_array, | 2386 bool is_js_array, |
| 2387 ElementsKind elements_kind, | 2387 ElementsKind elements_kind, |
| 2388 PropertyAccessType access_type, | 2388 PropertyAccessType access_type, |
| 2389 LoadKeyedHoleMode load_mode, | 2389 LoadKeyedHoleMode load_mode, |
| 2390 KeyedAccessStoreMode store_mode) { | 2390 KeyedAccessStoreMode store_mode) { |
| 2391 DCHECK(top_info()->IsStub() || checked_object->IsCompareMap() || |
| 2392 checked_object->IsCheckMaps()); |
| 2391 DCHECK((!IsExternalArrayElementsKind(elements_kind) && | 2393 DCHECK((!IsExternalArrayElementsKind(elements_kind) && |
| 2392 !IsFixedTypedArrayElementsKind(elements_kind)) || | 2394 !IsFixedTypedArrayElementsKind(elements_kind)) || |
| 2393 !is_js_array); | 2395 !is_js_array); |
| 2394 // No GVNFlag is necessary for ElementsKind if there is an explicit dependency | 2396 // No GVNFlag is necessary for ElementsKind if there is an explicit dependency |
| 2395 // on a HElementsTransition instruction. The flag can also be removed if the | 2397 // on a HElementsTransition instruction. The flag can also be removed if the |
| 2396 // map to check has FAST_HOLEY_ELEMENTS, since there can be no further | 2398 // map to check has FAST_HOLEY_ELEMENTS, since there can be no further |
| 2397 // ElementsKind transitions. Finally, the dependency can be removed for stores | 2399 // ElementsKind transitions. Finally, the dependency can be removed for stores |
| 2398 // for FAST_ELEMENTS, since a transition to HOLEY elements won't change the | 2400 // for FAST_ELEMENTS, since a transition to HOLEY elements won't change the |
| 2399 // generated store code. | 2401 // generated store code. |
| 2400 if ((elements_kind == FAST_HOLEY_ELEMENTS) || | 2402 if ((elements_kind == FAST_HOLEY_ELEMENTS) || |
| (...skipping 6039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8440 | 8442 |
| 8441 { | 8443 { |
| 8442 NoObservableSideEffectsScope scope(this); | 8444 NoObservableSideEffectsScope scope(this); |
| 8443 | 8445 |
| 8444 length = Add<HLoadNamedField>( | 8446 length = Add<HLoadNamedField>( |
| 8445 array, nullptr, HObjectAccess::ForArrayLength(elements_kind)); | 8447 array, nullptr, HObjectAccess::ForArrayLength(elements_kind)); |
| 8446 | 8448 |
| 8447 new_size = AddUncasted<HAdd>(length, graph()->GetConstant1()); | 8449 new_size = AddUncasted<HAdd>(length, graph()->GetConstant1()); |
| 8448 | 8450 |
| 8449 bool is_array = receiver_map->instance_type() == JS_ARRAY_TYPE; | 8451 bool is_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| 8450 BuildUncheckedMonomorphicElementAccess(array, length, | 8452 HValue* checked_array = Add<HCheckMaps>(array, receiver_map); |
| 8451 value_to_push, is_array, | 8453 BuildUncheckedMonomorphicElementAccess( |
| 8452 elements_kind, STORE, | 8454 checked_array, length, value_to_push, is_array, elements_kind, |
| 8453 NEVER_RETURN_HOLE, | 8455 STORE, NEVER_RETURN_HOLE, STORE_AND_GROW_NO_TRANSITION); |
| 8454 STORE_AND_GROW_NO_TRANSITION); | |
| 8455 | 8456 |
| 8456 if (!ast_context()->IsEffect()) Push(new_size); | 8457 if (!ast_context()->IsEffect()) Push(new_size); |
| 8457 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); | 8458 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
| 8458 if (!ast_context()->IsEffect()) Drop(1); | 8459 if (!ast_context()->IsEffect()) Drop(1); |
| 8459 } | 8460 } |
| 8460 | 8461 |
| 8461 ast_context()->ReturnValue(new_size); | 8462 ast_context()->ReturnValue(new_size); |
| 8462 return true; | 8463 return true; |
| 8463 } | 8464 } |
| 8464 case kArrayShift: { | 8465 case kArrayShift: { |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8811 return true; | 8812 return true; |
| 8812 } | 8813 } |
| 8813 | 8814 |
| 8814 | 8815 |
| 8815 void HOptimizedGraphBuilder::HandleIndirectCall(Call* expr, HValue* function, | 8816 void HOptimizedGraphBuilder::HandleIndirectCall(Call* expr, HValue* function, |
| 8816 int arguments_count) { | 8817 int arguments_count) { |
| 8817 Handle<JSFunction> known_function; | 8818 Handle<JSFunction> known_function; |
| 8818 int args_count_no_receiver = arguments_count - 1; | 8819 int args_count_no_receiver = arguments_count - 1; |
| 8819 if (function->IsConstant() && | 8820 if (function->IsConstant() && |
| 8820 HConstant::cast(function)->handle(isolate())->IsJSFunction()) { | 8821 HConstant::cast(function)->handle(isolate())->IsJSFunction()) { |
| 8821 HValue* receiver = environment()->ExpressionStackAt(args_count_no_receiver); | |
| 8822 Handle<Map> receiver_map; | |
| 8823 if (receiver->IsConstant() && | |
| 8824 HConstant::cast(receiver)->handle(isolate())->IsHeapObject()) { | |
| 8825 receiver_map = | |
| 8826 handle(Handle<HeapObject>::cast( | |
| 8827 HConstant::cast(receiver)->handle(isolate()))->map()); | |
| 8828 } | |
| 8829 | |
| 8830 known_function = | 8822 known_function = |
| 8831 Handle<JSFunction>::cast(HConstant::cast(function)->handle(isolate())); | 8823 Handle<JSFunction>::cast(HConstant::cast(function)->handle(isolate())); |
| 8832 if (TryInlineBuiltinMethodCall(expr, known_function, receiver_map, | 8824 if (TryInlineBuiltinMethodCall(expr, known_function, Handle<Map>(), |
| 8833 args_count_no_receiver)) { | 8825 args_count_no_receiver)) { |
| 8834 if (FLAG_trace_inlining) { | 8826 if (FLAG_trace_inlining) { |
| 8835 PrintF("Inlining builtin "); | 8827 PrintF("Inlining builtin "); |
| 8836 known_function->ShortPrint(); | 8828 known_function->ShortPrint(); |
| 8837 PrintF("\n"); | 8829 PrintF("\n"); |
| 8838 } | 8830 } |
| 8839 return; | 8831 return; |
| 8840 } | 8832 } |
| 8841 | 8833 |
| 8842 if (TryInlineIndirectCall(known_function, expr, args_count_no_receiver)) { | 8834 if (TryInlineIndirectCall(known_function, expr, args_count_no_receiver)) { |
| (...skipping 4110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12953 if (ShouldProduceTraceOutput()) { | 12945 if (ShouldProduceTraceOutput()) { |
| 12954 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 12946 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 12955 } | 12947 } |
| 12956 | 12948 |
| 12957 #ifdef DEBUG | 12949 #ifdef DEBUG |
| 12958 graph_->Verify(false); // No full verify. | 12950 graph_->Verify(false); // No full verify. |
| 12959 #endif | 12951 #endif |
| 12960 } | 12952 } |
| 12961 | 12953 |
| 12962 } } // namespace v8::internal | 12954 } } // namespace v8::internal |
| OLD | NEW |