| 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 7926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7937 | 7937 |
| 7938 | 7938 |
| 7939 void HOptimizedGraphBuilder::BuildInlinedCallNewArray(CallNew* expr) { | 7939 void HOptimizedGraphBuilder::BuildInlinedCallNewArray(CallNew* expr) { |
| 7940 NoObservableSideEffectsScope no_effects(this); | 7940 NoObservableSideEffectsScope no_effects(this); |
| 7941 | 7941 |
| 7942 int argument_count = expr->arguments()->length(); | 7942 int argument_count = expr->arguments()->length(); |
| 7943 // We should at least have the constructor on the expression stack. | 7943 // We should at least have the constructor on the expression stack. |
| 7944 HValue* constructor = environment()->ExpressionStackAt(argument_count); | 7944 HValue* constructor = environment()->ExpressionStackAt(argument_count); |
| 7945 | 7945 |
| 7946 ElementsKind kind = expr->elements_kind(); | 7946 ElementsKind kind = expr->elements_kind(); |
| 7947 Handle<Cell> cell = expr->allocation_info_cell(); | 7947 Handle<AllocationSite> site = expr->allocation_site(); |
| 7948 Handle<AllocationSite> site(AllocationSite::cast(cell->value())); | 7948 ASSERT(!site.is_null()); |
| 7949 | 7949 |
| 7950 // Register on the site for deoptimization if the transition feedback changes. | 7950 // Register on the site for deoptimization if the transition feedback changes. |
| 7951 AllocationSite::AddDependentCompilationInfo( | 7951 AllocationSite::AddDependentCompilationInfo( |
| 7952 site, AllocationSite::TRANSITIONS, top_info()); | 7952 site, AllocationSite::TRANSITIONS, top_info()); |
| 7953 HInstruction* site_instruction = Add<HConstant>(site); | 7953 HInstruction* site_instruction = Add<HConstant>(site); |
| 7954 | 7954 |
| 7955 // In the single constant argument case, we may have to adjust elements kind | 7955 // In the single constant argument case, we may have to adjust elements kind |
| 7956 // to avoid creating a packed non-empty array. | 7956 // to avoid creating a packed non-empty array. |
| 7957 if (argument_count == 1 && !IsHoleyElementsKind(kind)) { | 7957 if (argument_count == 1 && !IsHoleyElementsKind(kind)) { |
| 7958 HValue* argument = environment()->Top(); | 7958 HValue* argument = environment()->Top(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8012 | 8012 |
| 8013 | 8013 |
| 8014 bool HOptimizedGraphBuilder::IsCallNewArrayInlineable(CallNew* expr) { | 8014 bool HOptimizedGraphBuilder::IsCallNewArrayInlineable(CallNew* expr) { |
| 8015 bool inline_ok = false; | 8015 bool inline_ok = false; |
| 8016 Handle<JSFunction> caller = current_info()->closure(); | 8016 Handle<JSFunction> caller = current_info()->closure(); |
| 8017 Handle<JSFunction> target(isolate()->global_context()->array_function(), | 8017 Handle<JSFunction> target(isolate()->global_context()->array_function(), |
| 8018 isolate()); | 8018 isolate()); |
| 8019 int argument_count = expr->arguments()->length(); | 8019 int argument_count = expr->arguments()->length(); |
| 8020 // We should have the function plus array arguments on the environment stack. | 8020 // We should have the function plus array arguments on the environment stack. |
| 8021 ASSERT(environment()->length() >= (argument_count + 1)); | 8021 ASSERT(environment()->length() >= (argument_count + 1)); |
| 8022 Handle<Cell> cell = expr->allocation_info_cell(); | 8022 Handle<AllocationSite> site = expr->allocation_site(); |
| 8023 AllocationSite* site = AllocationSite::cast(cell->value()); | 8023 ASSERT(!site.is_null()); |
| 8024 |
| 8024 if (site->CanInlineCall()) { | 8025 if (site->CanInlineCall()) { |
| 8025 // We also want to avoid inlining in certain 1 argument scenarios. | 8026 // We also want to avoid inlining in certain 1 argument scenarios. |
| 8026 if (argument_count == 1) { | 8027 if (argument_count == 1) { |
| 8027 HValue* argument = Top(); | 8028 HValue* argument = Top(); |
| 8028 if (argument->IsConstant()) { | 8029 if (argument->IsConstant()) { |
| 8029 // Do not inline if the constant length argument is not a smi or | 8030 // Do not inline if the constant length argument is not a smi or |
| 8030 // outside the valid range for a fast array. | 8031 // outside the valid range for a fast array. |
| 8031 HConstant* constant_argument = HConstant::cast(argument); | 8032 HConstant* constant_argument = HConstant::cast(argument); |
| 8032 if (constant_argument->HasSmiValue()) { | 8033 if (constant_argument->HasSmiValue()) { |
| 8033 int value = constant_argument->Integer32Value(); | 8034 int value = constant_argument->Integer32Value(); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8152 environment()->SetExpressionStackAt(receiver_index, function); | 8153 environment()->SetExpressionStackAt(receiver_index, function); |
| 8153 HInstruction* call = | 8154 HInstruction* call = |
| 8154 PreProcessCall(New<HCallNew>(function, argument_count)); | 8155 PreProcessCall(New<HCallNew>(function, argument_count)); |
| 8155 return ast_context()->ReturnInstruction(call, expr->id()); | 8156 return ast_context()->ReturnInstruction(call, expr->id()); |
| 8156 } else { | 8157 } else { |
| 8157 // The constructor function is both an operand to the instruction and an | 8158 // The constructor function is both an operand to the instruction and an |
| 8158 // argument to the construct call. | 8159 // argument to the construct call. |
| 8159 Handle<JSFunction> array_function( | 8160 Handle<JSFunction> array_function( |
| 8160 isolate()->global_context()->array_function(), isolate()); | 8161 isolate()->global_context()->array_function(), isolate()); |
| 8161 bool use_call_new_array = expr->target().is_identical_to(array_function); | 8162 bool use_call_new_array = expr->target().is_identical_to(array_function); |
| 8162 Handle<Cell> cell = expr->allocation_info_cell(); | |
| 8163 if (use_call_new_array && IsCallNewArrayInlineable(expr)) { | 8163 if (use_call_new_array && IsCallNewArrayInlineable(expr)) { |
| 8164 // Verify we are still calling the array function for our native context. | 8164 // Verify we are still calling the array function for our native context. |
| 8165 Add<HCheckValue>(function, array_function); | 8165 Add<HCheckValue>(function, array_function); |
| 8166 BuildInlinedCallNewArray(expr); | 8166 BuildInlinedCallNewArray(expr); |
| 8167 return; | 8167 return; |
| 8168 } | 8168 } |
| 8169 | 8169 |
| 8170 HBinaryCall* call; | 8170 HBinaryCall* call; |
| 8171 if (use_call_new_array) { | 8171 if (use_call_new_array) { |
| 8172 Add<HCheckValue>(function, array_function); | 8172 Add<HCheckValue>(function, array_function); |
| 8173 call = New<HCallNewArray>(function, argument_count, cell, | 8173 call = New<HCallNewArray>(function, argument_count, |
| 8174 expr->elements_kind()); | 8174 expr->elements_kind()); |
| 8175 } else { | 8175 } else { |
| 8176 call = New<HCallNew>(function, argument_count); | 8176 call = New<HCallNew>(function, argument_count); |
| 8177 } | 8177 } |
| 8178 PreProcessCall(call); | 8178 PreProcessCall(call); |
| 8179 return ast_context()->ReturnInstruction(call, expr->id()); | 8179 return ast_context()->ReturnInstruction(call, expr->id()); |
| 8180 } | 8180 } |
| 8181 } | 8181 } |
| 8182 | 8182 |
| 8183 | 8183 |
| (...skipping 2822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11006 if (ShouldProduceTraceOutput()) { | 11006 if (ShouldProduceTraceOutput()) { |
| 11007 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11007 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 11008 } | 11008 } |
| 11009 | 11009 |
| 11010 #ifdef DEBUG | 11010 #ifdef DEBUG |
| 11011 graph_->Verify(false); // No full verify. | 11011 graph_->Verify(false); // No full verify. |
| 11012 #endif | 11012 #endif |
| 11013 } | 11013 } |
| 11014 | 11014 |
| 11015 } } // namespace v8::internal | 11015 } } // namespace v8::internal |
| OLD | NEW |