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 7889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7900 | 7900 |
7901 void HOptimizedGraphBuilder::BuildInlinedCallNewArray(CallNew* expr) { | 7901 void HOptimizedGraphBuilder::BuildInlinedCallNewArray(CallNew* expr) { |
7902 NoObservableSideEffectsScope no_effects(this); | 7902 NoObservableSideEffectsScope no_effects(this); |
7903 | 7903 |
7904 int argument_count = expr->arguments()->length(); | 7904 int argument_count = expr->arguments()->length(); |
7905 // We should at least have the constructor on the expression stack. | 7905 // We should at least have the constructor on the expression stack. |
7906 HValue* constructor = environment()->ExpressionStackAt(argument_count); | 7906 HValue* constructor = environment()->ExpressionStackAt(argument_count); |
7907 | 7907 |
7908 ElementsKind kind = expr->elements_kind(); | 7908 ElementsKind kind = expr->elements_kind(); |
7909 Handle<Cell> cell = expr->allocation_info_cell(); | 7909 Handle<Cell> cell = expr->allocation_info_cell(); |
7910 AllocationSite* site = AllocationSite::cast(cell->value()); | 7910 Handle<AllocationSite> site(AllocationSite::cast(cell->value())); |
7911 | 7911 |
7912 // Register on the site for deoptimization if the cell value changes. | 7912 // Register on the site for deoptimization if the cell value changes. |
7913 site->AddDependentCompilationInfo(AllocationSite::TRANSITIONS, top_info()); | 7913 AllocationSite::AddDependentCompilationInfo( |
| 7914 site, AllocationSite::TRANSITIONS, top_info()); |
7914 HInstruction* cell_instruction = Add<HConstant>(cell); | 7915 HInstruction* cell_instruction = Add<HConstant>(cell); |
7915 | 7916 |
7916 // In the single constant argument case, we may have to adjust elements kind | 7917 // In the single constant argument case, we may have to adjust elements kind |
7917 // to avoid creating a packed non-empty array. | 7918 // to avoid creating a packed non-empty array. |
7918 if (argument_count == 1 && !IsHoleyElementsKind(kind)) { | 7919 if (argument_count == 1 && !IsHoleyElementsKind(kind)) { |
7919 HValue* argument = environment()->Top(); | 7920 HValue* argument = environment()->Top(); |
7920 if (argument->IsConstant()) { | 7921 if (argument->IsConstant()) { |
7921 HConstant* constant_argument = HConstant::cast(argument); | 7922 HConstant* constant_argument = HConstant::cast(argument); |
7922 ASSERT(constant_argument->HasSmiValue()); | 7923 ASSERT(constant_argument->HasSmiValue()); |
7923 int constant_array_size = constant_argument->Integer32Value(); | 7924 int constant_array_size = constant_argument->Integer32Value(); |
(...skipping 994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8918 // Inline the string addition into the stub when creating allocation | 8919 // Inline the string addition into the stub when creating allocation |
8919 // mementos to gather allocation site feedback. | 8920 // mementos to gather allocation site feedback. |
8920 if (graph()->info()->IsStub() && | 8921 if (graph()->info()->IsStub() && |
8921 allocation_mode.CreateAllocationMementos()) { | 8922 allocation_mode.CreateAllocationMementos()) { |
8922 return BuildStringAdd(left, right, allocation_mode); | 8923 return BuildStringAdd(left, right, allocation_mode); |
8923 } | 8924 } |
8924 | 8925 |
8925 // Register the dependent code with the allocation site. | 8926 // Register the dependent code with the allocation site. |
8926 if (!allocation_mode.feedback_site().is_null()) { | 8927 if (!allocation_mode.feedback_site().is_null()) { |
8927 ASSERT(!graph()->info()->IsStub()); | 8928 ASSERT(!graph()->info()->IsStub()); |
8928 allocation_mode.feedback_site()->AddDependentCompilationInfo( | 8929 Handle<AllocationSite> site(allocation_mode.feedback_site()); |
8929 AllocationSite::TENURING, top_info()); | 8930 AllocationSite::AddDependentCompilationInfo( |
| 8931 site, AllocationSite::TENURING, top_info()); |
8930 } | 8932 } |
8931 | 8933 |
8932 // Inline string addition if we know that we'll create a cons string. | 8934 // Inline string addition if we know that we'll create a cons string. |
8933 if (left->IsConstant()) { | 8935 if (left->IsConstant()) { |
8934 HConstant* c_left = HConstant::cast(left); | 8936 HConstant* c_left = HConstant::cast(left); |
8935 if (c_left->HasStringValue()) { | 8937 if (c_left->HasStringValue()) { |
8936 int c_left_length = c_left->StringValue()->length(); | 8938 int c_left_length = c_left->StringValue()->length(); |
8937 if (c_left_length == 0) { | 8939 if (c_left_length == 0) { |
8938 return right; | 8940 return right; |
8939 } else if (c_left_length + 1 >= ConsString::kMinLength) { | 8941 } else if (c_left_length + 1 >= ConsString::kMinLength) { |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9495 ASSERT(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); | 9497 ASSERT(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); |
9496 | 9498 |
9497 HType type = instance_type == JS_ARRAY_TYPE | 9499 HType type = instance_type == JS_ARRAY_TYPE |
9498 ? HType::JSArray() : HType::JSObject(); | 9500 ? HType::JSArray() : HType::JSObject(); |
9499 HValue* object_size_constant = Add<HConstant>( | 9501 HValue* object_size_constant = Add<HConstant>( |
9500 boilerplate_object->map()->instance_size()); | 9502 boilerplate_object->map()->instance_size()); |
9501 | 9503 |
9502 PretenureFlag pretenure_flag = isolate()->heap()->GetPretenureMode(); | 9504 PretenureFlag pretenure_flag = isolate()->heap()->GetPretenureMode(); |
9503 if (FLAG_allocation_site_pretenuring) { | 9505 if (FLAG_allocation_site_pretenuring) { |
9504 pretenure_flag = site_context->current()->GetPretenureMode(); | 9506 pretenure_flag = site_context->current()->GetPretenureMode(); |
9505 site_context->current()->AddDependentCompilationInfo( | 9507 Handle<AllocationSite> site(site_context->current()); |
9506 AllocationSite::TENURING, top_info()); | 9508 AllocationSite::AddDependentCompilationInfo( |
| 9509 site, AllocationSite::TENURING, top_info()); |
9507 } | 9510 } |
9508 | 9511 |
9509 HInstruction* object = Add<HAllocate>(object_size_constant, type, | 9512 HInstruction* object = Add<HAllocate>(object_size_constant, type, |
9510 pretenure_flag, instance_type, site_context->current()); | 9513 pretenure_flag, instance_type, site_context->current()); |
9511 | 9514 |
9512 BuildEmitObjectHeader(boilerplate_object, object); | 9515 BuildEmitObjectHeader(boilerplate_object, object); |
9513 | 9516 |
9514 Handle<FixedArrayBase> elements(boilerplate_object->elements()); | 9517 Handle<FixedArrayBase> elements(boilerplate_object->elements()); |
9515 int elements_size = (elements->length() > 0 && | 9518 int elements_size = (elements->length() > 0 && |
9516 elements->map() != isolate()->heap()->fixed_cow_array_map()) ? | 9519 elements->map() != isolate()->heap()->fixed_cow_array_map()) ? |
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10972 if (ShouldProduceTraceOutput()) { | 10975 if (ShouldProduceTraceOutput()) { |
10973 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 10976 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
10974 } | 10977 } |
10975 | 10978 |
10976 #ifdef DEBUG | 10979 #ifdef DEBUG |
10977 graph_->Verify(false); // No full verify. | 10980 graph_->Verify(false); // No full verify. |
10978 #endif | 10981 #endif |
10979 } | 10982 } |
10980 | 10983 |
10981 } } // namespace v8::internal | 10984 } } // namespace v8::internal |
OLD | NEW |