Chromium Code Reviews| 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 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 254 // modify and reset the ticks until next adjustment. | 254 // modify and reset the ticks until next adjustment. |
| 255 if (sampler_threshold_ > kSamplerThresholdMin) { | 255 if (sampler_threshold_ > kSamplerThresholdMin) { |
| 256 sampler_threshold_ -= kSamplerThresholdDelta; | 256 sampler_threshold_ -= kSamplerThresholdDelta; |
| 257 sampler_ticks_until_threshold_adjustment_ = | 257 sampler_ticks_until_threshold_adjustment_ = |
| 258 kSamplerTicksBetweenThresholdAdjustment; | 258 kSamplerTicksBetweenThresholdAdjustment; |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 } | 261 } |
| 262 } | 262 } |
| 263 | 263 |
| 264 if (function->IsMarkedForLazyRecompilation() && | 264 Code* shared_code = function->shared()->code(); |
| 265 function->shared()->code()->kind() == Code::FUNCTION) { | 265 if (shared_code->kind() != Code::FUNCTION) continue; |
| 266 Code* unoptimized = function->shared()->code(); | 266 |
| 267 int nesting = unoptimized->allow_osr_at_loop_nesting_level(); | 267 if (function->IsMarkedForLazyRecompilation()) { |
| 268 int nesting = shared_code->allow_osr_at_loop_nesting_level(); | |
| 268 if (nesting == 0) AttemptOnStackReplacement(function); | 269 if (nesting == 0) AttemptOnStackReplacement(function); |
| 269 int new_nesting = Min(nesting + 1, Code::kMaxLoopNestingMarker); | 270 int new_nesting = Min(nesting + 1, Code::kMaxLoopNestingMarker); |
| 270 unoptimized->set_allow_osr_at_loop_nesting_level(new_nesting); | 271 shared_code->set_allow_osr_at_loop_nesting_level(new_nesting); |
| 271 } | 272 } |
| 272 | 273 |
| 273 // Do not record non-optimizable functions. | 274 // Do not record non-optimizable functions. |
| 274 if (!function->IsOptimizable()) continue; | 275 if (!function->IsOptimizable()) continue; |
| 275 if (function->shared()->optimization_disabled()) continue; | 276 if (function->shared()->optimization_disabled()) continue; |
| 276 | 277 |
| 277 // Only record top-level code on top of the execution stack and | 278 // Only record top-level code on top of the execution stack and |
| 278 // avoid optimizing excessively large scripts since top-level code | 279 // avoid optimizing excessively large scripts since top-level code |
| 279 // will be executed only once. | 280 // will be executed only once. |
| 280 const int kMaxToplevelSourceSize = 10 * 1024; | 281 const int kMaxToplevelSourceSize = 10 * 1024; |
| 281 if (function->shared()->is_toplevel() | 282 if (function->shared()->is_toplevel() |
| 282 && (frame_count > 1 | 283 && (frame_count > 1 |
| 283 || function->shared()->SourceSize() > kMaxToplevelSourceSize)) { | 284 || function->shared()->SourceSize() > kMaxToplevelSourceSize)) { |
| 284 continue; | 285 continue; |
| 285 } | 286 } |
| 286 | 287 |
| 287 if (FLAG_watch_ic_patching) { | 288 if (FLAG_watch_ic_patching) { |
| 288 int ticks = function->shared()->profiler_ticks(); | 289 int ticks = shared_code->profiler_ticks(); |
| 289 | 290 |
| 290 if (ticks >= kProfilerTicksBeforeOptimization) { | 291 if (ticks >= kProfilerTicksBeforeOptimization) { |
| 291 int typeinfo, total, percentage; | 292 int typeinfo, total, percentage; |
| 292 GetICCounts(function, &typeinfo, &total, &percentage); | 293 GetICCounts(function, &typeinfo, &total, &percentage); |
| 293 if (percentage >= FLAG_type_info_threshold) { | 294 if (percentage >= FLAG_type_info_threshold) { |
| 294 // If this particular function hasn't had any ICs patched for enough | 295 // If this particular function hasn't had any ICs patched for enough |
| 295 // ticks, optimize it now. | 296 // ticks, optimize it now. |
| 296 Optimize(function, "hot and stable"); | 297 Optimize(function, "hot and stable"); |
| 297 } else if (ticks >= 100) { | 298 } else if (ticks >= 100) { |
|
ulan
2012/03/27 11:40:58
I think 100 should be a named constant with a stat
Jakob Kummerow
2012/03/27 12:19:10
Done.
| |
| 298 // If this function does not have enough type info, but has | 299 // If this function does not have enough type info, but has |
| 299 // seen a huge number of ticks, optimize it as it is. | 300 // seen a huge number of ticks, optimize it as it is. |
| 300 Optimize(function, "not much type info but very hot"); | 301 Optimize(function, "not much type info but very hot"); |
| 301 } else { | 302 } else { |
| 302 function->shared()->set_profiler_ticks(ticks + 1); | 303 shared_code->set_profiler_ticks(ticks + 1); |
| 303 if (FLAG_trace_opt_verbose) { | 304 if (FLAG_trace_opt_verbose) { |
| 304 PrintF("[not yet optimizing "); | 305 PrintF("[not yet optimizing "); |
| 305 function->PrintName(); | 306 function->PrintName(); |
| 306 PrintF(", not enough type info: %d/%d (%d%%)]\n", | 307 PrintF(", not enough type info: %d/%d (%d%%)]\n", |
| 307 typeinfo, total, percentage); | 308 typeinfo, total, percentage); |
| 308 } | 309 } |
| 309 } | 310 } |
| 310 } else if (!any_ic_changed_ && | 311 } else if (!any_ic_changed_ && |
| 311 function->shared()->code()->instruction_size() < kMaxSizeEarlyOpt) { | 312 shared_code->instruction_size() < kMaxSizeEarlyOpt) { |
| 312 // If no IC was patched since the last tick and this function is very | 313 // If no IC was patched since the last tick and this function is very |
| 313 // small, optimistically optimize it now. | 314 // small, optimistically optimize it now. |
| 314 Optimize(function, "small function"); | 315 Optimize(function, "small function"); |
| 315 } else if (!code_generated_ && | 316 } else if (!code_generated_ && |
| 316 !any_ic_changed_ && | 317 !any_ic_changed_ && |
| 317 total_code_generated_ > 0 && | 318 total_code_generated_ > 0 && |
| 318 total_code_generated_ < 2000) { | 319 total_code_generated_ < 2000) { |
| 319 // If no code was generated and no IC was patched since the last tick, | 320 // If no code was generated and no IC was patched since the last tick, |
| 320 // but a little code has already been generated since last Reset(), | 321 // but a little code has already been generated since last Reset(), |
| 321 // then type info might already be stable and we can optimize now. | 322 // then type info might already be stable and we can optimize now. |
| 322 Optimize(function, "stable on startup"); | 323 Optimize(function, "stable on startup"); |
| 323 } else { | 324 } else { |
| 324 function->shared()->set_profiler_ticks(ticks + 1); | 325 shared_code->set_profiler_ticks(ticks + 1); |
| 325 } | 326 } |
| 326 } else { // !FLAG_watch_ic_patching | 327 } else { // !FLAG_watch_ic_patching |
| 327 samples[sample_count++] = function; | 328 samples[sample_count++] = function; |
| 328 | 329 |
| 329 int function_size = function->shared()->SourceSize(); | 330 int function_size = function->shared()->SourceSize(); |
| 330 int threshold_size_factor = (function_size > kSizeLimit) | 331 int threshold_size_factor = (function_size > kSizeLimit) |
| 331 ? sampler_threshold_size_factor_ | 332 ? sampler_threshold_size_factor_ |
| 332 : 1; | 333 : 1; |
| 333 | 334 |
| 334 int threshold = sampler_threshold_ * threshold_size_factor; | 335 int threshold = sampler_threshold_ * threshold_size_factor; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 478 | 479 |
| 479 bool RuntimeProfilerRateLimiter::SuspendIfNecessary() { | 480 bool RuntimeProfilerRateLimiter::SuspendIfNecessary() { |
| 480 if (!RuntimeProfiler::IsSomeIsolateInJS()) { | 481 if (!RuntimeProfiler::IsSomeIsolateInJS()) { |
| 481 return RuntimeProfiler::WaitForSomeIsolateToEnterJS(); | 482 return RuntimeProfiler::WaitForSomeIsolateToEnterJS(); |
| 482 } | 483 } |
| 483 return false; | 484 return false; |
| 484 } | 485 } |
| 485 | 486 |
| 486 | 487 |
| 487 } } // namespace v8::internal | 488 } } // namespace v8::internal |
| OLD | NEW |