Index: src/runtime-profiler.cc |
diff --git a/src/runtime-profiler.cc b/src/runtime-profiler.cc |
index 246d1193f9e83aea59db3e347e9db68bad7b6ca2..9e011fe6630b2906a805847c088438d321f9c1a3 100644 |
--- a/src/runtime-profiler.cc |
+++ b/src/runtime-profiler.cc |
@@ -127,8 +127,9 @@ void RuntimeProfiler::Baseline(JSFunction* function, const char* reason) { |
function->MarkForBaseline(); |
} |
-void RuntimeProfiler::AttemptOnStackReplacement(JSFunction* function, |
+void RuntimeProfiler::AttemptOnStackReplacement(JavaScriptFrame* frame, |
int loop_nesting_levels) { |
+ JSFunction* function = frame->function(); |
SharedFunctionInfo* shared = function->shared(); |
if (!FLAG_use_osr || function->shared()->IsBuiltin()) { |
return; |
@@ -153,13 +154,15 @@ void RuntimeProfiler::AttemptOnStackReplacement(JSFunction* function, |
PrintF("]\n"); |
} |
- if (shared->code()->kind() == Code::FUNCTION) { |
+ if (frame->type() == StackFrame::JAVA_SCRIPT) { |
+ DCHECK(shared->HasBaselineCode()); |
DCHECK(BackEdgeTable::Verify(shared->GetIsolate(), shared->code())); |
for (int i = 0; i < loop_nesting_levels; i++) { |
BackEdgeTable::Patch(isolate_, shared->code()); |
} |
- } else if (shared->HasBytecodeArray()) { |
- DCHECK(FLAG_ignition_osr); // Should only happen when enabled. |
+ } else if (frame->type() == StackFrame::INTERPRETED) { |
+ DCHECK(shared->HasBytecodeArray()); |
+ if (!FLAG_ignition_osr) return; // Only use this when enabled. |
int level = shared->bytecode_array()->osr_loop_nesting_level(); |
shared->bytecode_array()->set_osr_loop_nesting_level( |
Min(level + loop_nesting_levels, AbstractCode::kMaxLoopNestingMarker)); |
@@ -169,17 +172,17 @@ void RuntimeProfiler::AttemptOnStackReplacement(JSFunction* function, |
} |
void RuntimeProfiler::MaybeOptimizeFullCodegen(JSFunction* function, |
- int frame_count, |
- bool frame_optimized) { |
+ JavaScriptFrame* frame, |
+ int frame_count) { |
SharedFunctionInfo* shared = function->shared(); |
Code* shared_code = shared->code(); |
if (shared_code->kind() != Code::FUNCTION) return; |
if (function->IsInOptimizationQueue()) return; |
if (FLAG_always_osr) { |
- AttemptOnStackReplacement(function, AbstractCode::kMaxLoopNestingMarker); |
+ AttemptOnStackReplacement(frame, AbstractCode::kMaxLoopNestingMarker); |
// Fall through and do a normal optimized compile as well. |
- } else if (!frame_optimized && |
+ } else if (!frame->is_optimized() && |
(function->IsMarkedForOptimization() || |
function->IsMarkedForConcurrentOptimization() || |
function->IsOptimized())) { |
@@ -193,7 +196,7 @@ void RuntimeProfiler::MaybeOptimizeFullCodegen(JSFunction* function, |
ticks < Code::ProfilerTicksField::kMax) { |
shared_code->set_profiler_ticks(ticks + 1); |
} else { |
- AttemptOnStackReplacement(function); |
+ AttemptOnStackReplacement(frame); |
} |
return; |
} |
@@ -265,7 +268,7 @@ void RuntimeProfiler::MaybeOptimizeFullCodegen(JSFunction* function, |
} |
void RuntimeProfiler::MaybeBaselineIgnition(JSFunction* function, |
- bool frame_optimized) { |
+ JavaScriptFrame* frame) { |
if (function->IsInOptimizationQueue()) return; |
SharedFunctionInfo* shared = function->shared(); |
@@ -274,10 +277,10 @@ void RuntimeProfiler::MaybeBaselineIgnition(JSFunction* function, |
// TODO(rmcilroy): Also ensure we only OSR top-level code if it is smaller |
// than kMaxToplevelSourceSize. |
- if (FLAG_ignition_osr && FLAG_always_osr) { |
- AttemptOnStackReplacement(function, AbstractCode::kMaxLoopNestingMarker); |
+ if (FLAG_always_osr) { |
+ AttemptOnStackReplacement(frame, AbstractCode::kMaxLoopNestingMarker); |
// Fall through and do a normal baseline compile as well. |
- } else if (!frame_optimized && |
+ } else if (!frame->is_optimized() && |
(function->IsMarkedForBaseline() || |
function->IsMarkedForOptimization() || |
function->IsMarkedForConcurrentOptimization() || |
@@ -287,9 +290,8 @@ void RuntimeProfiler::MaybeBaselineIgnition(JSFunction* function, |
int64_t allowance = |
kOSRCodeSizeAllowanceBaseIgnition + |
static_cast<int64_t>(ticks) * kOSRCodeSizeAllowancePerTickIgnition; |
- if (FLAG_ignition_osr && shared->HasBytecodeArray() && |
- shared->bytecode_array()->Size() <= allowance) { |
- AttemptOnStackReplacement(function); |
+ if (shared->bytecode_array()->Size() <= allowance) { |
+ AttemptOnStackReplacement(frame); |
} |
return; |
} |
@@ -307,7 +309,7 @@ void RuntimeProfiler::MaybeBaselineIgnition(JSFunction* function, |
} |
void RuntimeProfiler::MaybeOptimizeIgnition(JSFunction* function, |
- bool frame_optimized) { |
+ JavaScriptFrame* frame) { |
if (function->IsInOptimizationQueue()) return; |
SharedFunctionInfo* shared = function->shared(); |
@@ -316,10 +318,10 @@ void RuntimeProfiler::MaybeOptimizeIgnition(JSFunction* function, |
// TODO(rmcilroy): Also ensure we only OSR top-level code if it is smaller |
// than kMaxToplevelSourceSize. |
- if (FLAG_ignition_osr && FLAG_always_osr) { |
- AttemptOnStackReplacement(function, AbstractCode::kMaxLoopNestingMarker); |
+ if (FLAG_always_osr) { |
+ AttemptOnStackReplacement(frame, AbstractCode::kMaxLoopNestingMarker); |
// Fall through and do a normal optimized compile as well. |
- } else if (!frame_optimized && |
+ } else if (!frame->is_optimized() && |
(function->IsMarkedForBaseline() || |
function->IsMarkedForOptimization() || |
function->IsMarkedForConcurrentOptimization() || |
@@ -329,9 +331,8 @@ void RuntimeProfiler::MaybeOptimizeIgnition(JSFunction* function, |
int64_t allowance = |
kOSRCodeSizeAllowanceBaseIgnition + |
static_cast<int64_t>(ticks) * kOSRCodeSizeAllowancePerTickIgnition; |
- if (FLAG_ignition_osr && shared->HasBytecodeArray() && |
- shared->bytecode_array()->Size() <= allowance) { |
- AttemptOnStackReplacement(function); |
+ if (shared->bytecode_array()->Size() <= allowance) { |
+ AttemptOnStackReplacement(frame); |
} |
return; |
} |
@@ -405,14 +406,14 @@ void RuntimeProfiler::MarkCandidatesForOptimization() { |
Compiler::NextCompilationTier(function); |
if (function->shared()->HasBytecodeArray()) { |
if (next_tier == Compiler::BASELINE) { |
- MaybeBaselineIgnition(function, frame->is_optimized()); |
+ MaybeBaselineIgnition(function, frame); |
} else { |
DCHECK_EQ(next_tier, Compiler::OPTIMIZED); |
- MaybeOptimizeIgnition(function, frame->is_optimized()); |
+ MaybeOptimizeIgnition(function, frame); |
} |
} else { |
DCHECK_EQ(next_tier, Compiler::OPTIMIZED); |
- MaybeOptimizeFullCodegen(function, frame_count, frame->is_optimized()); |
+ MaybeOptimizeFullCodegen(function, frame, frame_count); |
} |
} |
any_ic_changed_ = false; |