| Index: src/runtime-profiler.cc
|
| diff --git a/src/runtime-profiler.cc b/src/runtime-profiler.cc
|
| index dddcad060ded5f24807b474fe7407dc14ddcafee..cba563f601824ed7c95afac0cfc025251dd2e62e 100644
|
| --- a/src/runtime-profiler.cc
|
| +++ b/src/runtime-profiler.cc
|
| @@ -110,7 +110,9 @@ void RuntimeProfiler::Optimize(JSFunction* function, const char* reason) {
|
| }
|
|
|
|
|
| -void RuntimeProfiler::AttemptOnStackReplacement(JSFunction* function) {
|
| +void RuntimeProfiler::AttemptOnStackReplacement(JSFunction* function,
|
| + int loop_nesting_levels) {
|
| + SharedFunctionInfo* shared = function->shared();
|
| // See AlwaysFullCompiler (in compiler.cc) comment on why we need
|
| // Debug::has_break_points().
|
| if (!FLAG_use_osr ||
|
| @@ -119,7 +121,6 @@ void RuntimeProfiler::AttemptOnStackReplacement(JSFunction* function) {
|
| return;
|
| }
|
|
|
| - SharedFunctionInfo* shared = function->shared();
|
| // If the code is not optimizable, don't try OSR.
|
| if (!shared->code()->optimizable()) return;
|
|
|
| @@ -137,7 +138,9 @@ void RuntimeProfiler::AttemptOnStackReplacement(JSFunction* function) {
|
| PrintF("]\n");
|
| }
|
|
|
| - BackEdgeTable::Patch(isolate_, shared->code());
|
| + for (int i = 0; i < loop_nesting_levels; i++) {
|
| + BackEdgeTable::Patch(isolate_, shared->code());
|
| + }
|
| }
|
|
|
|
|
| @@ -175,14 +178,8 @@ void RuntimeProfiler::OptimizeNow() {
|
| if (shared_code->kind() != Code::FUNCTION) continue;
|
| if (function->IsInOptimizationQueue()) continue;
|
|
|
| - if (FLAG_always_osr &&
|
| - shared_code->allow_osr_at_loop_nesting_level() == 0) {
|
| - // Testing mode: always try an OSR compile for every function.
|
| - for (int i = 0; i < Code::kMaxLoopNestingMarker; i++) {
|
| - // TODO(titzer): fix AttemptOnStackReplacement to avoid this dumb loop.
|
| - shared_code->set_allow_osr_at_loop_nesting_level(i);
|
| - AttemptOnStackReplacement(function);
|
| - }
|
| + if (FLAG_always_osr) {
|
| + AttemptOnStackReplacement(function, Code::kMaxLoopNestingMarker);
|
| // Fall through and do a normal optimized compile as well.
|
| } else if (!frame->is_optimized() &&
|
| (function->IsMarkedForOptimization() ||
|
| @@ -196,12 +193,7 @@ void RuntimeProfiler::OptimizeNow() {
|
| if (shared_code->CodeSize() > allowance) {
|
| if (ticks < 255) shared_code->set_profiler_ticks(ticks + 1);
|
| } else {
|
| - int nesting = shared_code->allow_osr_at_loop_nesting_level();
|
| - if (nesting < Code::kMaxLoopNestingMarker) {
|
| - int new_nesting = nesting + 1;
|
| - shared_code->set_allow_osr_at_loop_nesting_level(new_nesting);
|
| - AttemptOnStackReplacement(function);
|
| - }
|
| + AttemptOnStackReplacement(function);
|
| }
|
| continue;
|
| }
|
|
|