| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 bool CompilationInfo::ShouldSelfOptimize() { | 224 bool CompilationInfo::ShouldSelfOptimize() { |
| 225 return FLAG_self_optimization && | 225 return FLAG_self_optimization && |
| 226 FLAG_crankshaft && | 226 FLAG_crankshaft && |
| 227 !function()->flags()->Contains(kDontSelfOptimize) && | 227 !function()->flags()->Contains(kDontSelfOptimize) && |
| 228 !function()->flags()->Contains(kDontOptimize) && | 228 !function()->flags()->Contains(kDontOptimize) && |
| 229 function()->scope()->AllowsLazyCompilation() && | 229 function()->scope()->AllowsLazyCompilation() && |
| 230 (shared_info().is_null() || !shared_info()->optimization_disabled()); | 230 (shared_info().is_null() || !shared_info()->optimization_disabled()); |
| 231 } | 231 } |
| 232 | 232 |
| 233 | 233 |
| 234 void CompilationInfo::AbortOptimization() { | |
| 235 Handle<Code> code(shared_info()->code()); | |
| 236 SetCode(code); | |
| 237 } | |
| 238 | |
| 239 | |
| 240 // Determine whether to use the full compiler for all code. If the flag | 234 // Determine whether to use the full compiler for all code. If the flag |
| 241 // --always-full-compiler is specified this is the case. For the virtual frame | 235 // --always-full-compiler is specified this is the case. For the virtual frame |
| 242 // based compiler the full compiler is also used if a debugger is connected, as | 236 // based compiler the full compiler is also used if a debugger is connected, as |
| 243 // the code from the full compiler supports mode precise break points. For the | 237 // the code from the full compiler supports mode precise break points. For the |
| 244 // crankshaft adaptive compiler debugging the optimized code is not possible at | 238 // crankshaft adaptive compiler debugging the optimized code is not possible at |
| 245 // all. However crankshaft support recompilation of functions, so in this case | 239 // all. However crankshaft support recompilation of functions, so in this case |
| 246 // the full compiler need not be be used if a debugger is attached, but only if | 240 // the full compiler need not be be used if a debugger is attached, but only if |
| 247 // break points has actually been set. | 241 // break points has actually been set. |
| 248 static bool IsDebuggerActive(Isolate* isolate) { | 242 static bool IsDebuggerActive(Isolate* isolate) { |
| 249 #ifdef ENABLE_DEBUGGER_SUPPORT | 243 #ifdef ENABLE_DEBUGGER_SUPPORT |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 } | 309 } |
| 316 | 310 |
| 317 | 311 |
| 318 OptimizingCompiler::Status OptimizingCompiler::CreateGraph() { | 312 OptimizingCompiler::Status OptimizingCompiler::CreateGraph() { |
| 319 ASSERT(V8::UseCrankshaft()); | 313 ASSERT(V8::UseCrankshaft()); |
| 320 ASSERT(info()->IsOptimizing()); | 314 ASSERT(info()->IsOptimizing()); |
| 321 ASSERT(!info()->IsCompilingForDebugging()); | 315 ASSERT(!info()->IsCompilingForDebugging()); |
| 322 | 316 |
| 323 // We should never arrive here if there is no code object on the | 317 // We should never arrive here if there is no code object on the |
| 324 // shared function object. | 318 // shared function object. |
| 325 Handle<Code> code(info()->shared_info()->code()); | 319 ASSERT(info()->shared_info()->code()->kind() == Code::FUNCTION); |
| 326 ASSERT(code->kind() == Code::FUNCTION); | |
| 327 | 320 |
| 328 // We should never arrive here if optimization has been disabled on the | 321 // We should never arrive here if optimization has been disabled on the |
| 329 // shared function info. | 322 // shared function info. |
| 330 ASSERT(!info()->shared_info()->optimization_disabled()); | 323 ASSERT(!info()->shared_info()->optimization_disabled()); |
| 331 | 324 |
| 332 // Fall back to using the full code generator if it's not possible | 325 // Fall back to using the full code generator if it's not possible |
| 333 // to use the Hydrogen-based optimizing compiler. We already have | 326 // to use the Hydrogen-based optimizing compiler. We already have |
| 334 // generated code for this from the shared function object. | 327 // generated code for this from the shared function object. |
| 335 if (AlwaysFullCompiler(isolate())) { | 328 if (AlwaysFullCompiler(isolate())) { |
| 336 info()->SetCode(code); | 329 info()->AbortOptimization(); |
| 337 return SetLastStatus(BAILED_OUT); | 330 return SetLastStatus(BAILED_OUT); |
| 338 } | 331 } |
| 339 | 332 |
| 340 // Limit the number of times we re-compile a functions with | 333 // Limit the number of times we re-compile a functions with |
| 341 // the optimizing compiler. | 334 // the optimizing compiler. |
| 342 const int kMaxOptCount = | 335 const int kMaxOptCount = |
| 343 FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000; | 336 FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000; |
| 344 if (info()->opt_count() > kMaxOptCount) { | 337 if (info()->opt_count() > kMaxOptCount) { |
| 345 info()->set_bailout_reason(kOptimizedTooManyTimes); | 338 info()->set_bailout_reason(kOptimizedTooManyTimes); |
| 346 return AbortOptimization(); | 339 return AbortOptimization(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 362 | 355 |
| 363 const int locals_limit = LUnallocated::kMaxFixedSlotIndex; | 356 const int locals_limit = LUnallocated::kMaxFixedSlotIndex; |
| 364 if (!info()->osr_ast_id().IsNone() && | 357 if (!info()->osr_ast_id().IsNone() && |
| 365 scope->num_parameters() + 1 + scope->num_stack_slots() > locals_limit) { | 358 scope->num_parameters() + 1 + scope->num_stack_slots() > locals_limit) { |
| 366 info()->set_bailout_reason(kTooManyParametersLocals); | 359 info()->set_bailout_reason(kTooManyParametersLocals); |
| 367 return AbortOptimization(); | 360 return AbortOptimization(); |
| 368 } | 361 } |
| 369 | 362 |
| 370 // Take --hydrogen-filter into account. | 363 // Take --hydrogen-filter into account. |
| 371 if (!info()->closure()->PassesHydrogenFilter()) { | 364 if (!info()->closure()->PassesHydrogenFilter()) { |
| 372 info()->SetCode(code); | 365 info()->AbortOptimization(); |
| 373 return SetLastStatus(BAILED_OUT); | 366 return SetLastStatus(BAILED_OUT); |
| 374 } | 367 } |
| 375 | 368 |
| 376 // Recompile the unoptimized version of the code if the current version | 369 // Recompile the unoptimized version of the code if the current version |
| 377 // doesn't have deoptimization support. Alternatively, we may decide to | 370 // doesn't have deoptimization support. Alternatively, we may decide to |
| 378 // run the full code generator to get a baseline for the compile-time | 371 // run the full code generator to get a baseline for the compile-time |
| 379 // performance of the hydrogen-based compiler. | 372 // performance of the hydrogen-based compiler. |
| 380 bool should_recompile = !info()->shared_info()->has_deoptimization_support(); | 373 bool should_recompile = !info()->shared_info()->has_deoptimization_support(); |
| 381 if (should_recompile || FLAG_hydrogen_stats) { | 374 if (should_recompile || FLAG_hydrogen_stats) { |
| 382 int64_t start_ticks = 0; | 375 int64_t start_ticks = 0; |
| 383 if (FLAG_hydrogen_stats) { | 376 if (FLAG_hydrogen_stats) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 403 int64_t ticks = OS::Ticks() - start_ticks; | 396 int64_t ticks = OS::Ticks() - start_ticks; |
| 404 isolate()->GetHStatistics()->IncrementFullCodeGen(ticks); | 397 isolate()->GetHStatistics()->IncrementFullCodeGen(ticks); |
| 405 } | 398 } |
| 406 } | 399 } |
| 407 | 400 |
| 408 // Check that the unoptimized, shared code is ready for | 401 // Check that the unoptimized, shared code is ready for |
| 409 // optimizations. When using the always_opt flag we disregard the | 402 // optimizations. When using the always_opt flag we disregard the |
| 410 // optimizable marker in the code object and optimize anyway. This | 403 // optimizable marker in the code object and optimize anyway. This |
| 411 // is safe as long as the unoptimized code has deoptimization | 404 // is safe as long as the unoptimized code has deoptimization |
| 412 // support. | 405 // support. |
| 413 ASSERT(FLAG_always_opt || code->optimizable()); | 406 ASSERT(FLAG_always_opt || info()->shared_info()->code()->optimizable()); |
| 414 ASSERT(info()->shared_info()->has_deoptimization_support()); | 407 ASSERT(info()->shared_info()->has_deoptimization_support()); |
| 415 | 408 |
| 416 if (FLAG_trace_hydrogen) { | 409 if (FLAG_trace_hydrogen) { |
| 417 Handle<String> name = info()->function()->debug_name(); | 410 Handle<String> name = info()->function()->debug_name(); |
| 418 PrintF("-----------------------------------------------------------\n"); | 411 PrintF("-----------------------------------------------------------\n"); |
| 419 PrintF("Compiling method %s using hydrogen\n", *name->ToCString()); | 412 PrintF("Compiling method %s using hydrogen\n", *name->ToCString()); |
| 420 isolate()->GetHTracer()->TraceCompilation(info()); | 413 isolate()->GetHTracer()->TraceCompilation(info()); |
| 421 } | 414 } |
| 422 | 415 |
| 423 // Type-check the function. | 416 // Type-check the function. |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 if (info->shared_info()->SearchOptimizedCodeMap( | 1074 if (info->shared_info()->SearchOptimizedCodeMap( |
| 1082 info->closure()->context()->native_context()) == -1) { | 1075 info->closure()->context()->native_context()) == -1) { |
| 1083 InsertCodeIntoOptimizedCodeMap(*info); | 1076 InsertCodeIntoOptimizedCodeMap(*info); |
| 1084 } | 1077 } |
| 1085 if (FLAG_trace_parallel_recompilation) { | 1078 if (FLAG_trace_parallel_recompilation) { |
| 1086 PrintF(" ** Optimized code for "); | 1079 PrintF(" ** Optimized code for "); |
| 1087 info->closure()->PrintName(); | 1080 info->closure()->PrintName(); |
| 1088 PrintF(" installed.\n"); | 1081 PrintF(" installed.\n"); |
| 1089 } | 1082 } |
| 1090 } else { | 1083 } else { |
| 1091 info->SetCode(Handle<Code>(info->shared_info()->code())); | 1084 info->AbortOptimization(); |
| 1092 InstallFullCode(*info); | 1085 InstallFullCode(*info); |
| 1093 } | 1086 } |
| 1094 // Optimized code is finally replacing unoptimized code. Reset the latter's | 1087 // Optimized code is finally replacing unoptimized code. Reset the latter's |
| 1095 // profiler ticks to prevent too soon re-opt after a deopt. | 1088 // profiler ticks to prevent too soon re-opt after a deopt. |
| 1096 info->shared_info()->code()->set_profiler_ticks(0); | 1089 info->shared_info()->code()->set_profiler_ticks(0); |
| 1097 ASSERT(!info->closure()->IsMarkedForInstallingRecompiledCode()); | 1090 ASSERT(!info->closure()->IsMarkedForInstallingRecompiledCode()); |
| 1098 } | 1091 } |
| 1099 | 1092 |
| 1100 | 1093 |
| 1101 Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, | 1094 Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1255 // Trace if the appropriate trace flag is set and the phase name's first | 1248 // Trace if the appropriate trace flag is set and the phase name's first |
| 1256 // character is in the FLAG_trace_phase command line parameter. | 1249 // character is in the FLAG_trace_phase command line parameter. |
| 1257 bool tracing_on = info()->IsStub() ? | 1250 bool tracing_on = info()->IsStub() ? |
| 1258 FLAG_trace_hydrogen_stubs : | 1251 FLAG_trace_hydrogen_stubs : |
| 1259 FLAG_trace_hydrogen; | 1252 FLAG_trace_hydrogen; |
| 1260 return (tracing_on && | 1253 return (tracing_on && |
| 1261 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); | 1254 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); |
| 1262 } | 1255 } |
| 1263 | 1256 |
| 1264 } } // namespace v8::internal | 1257 } } // namespace v8::internal |
| OLD | NEW |