[Interpreter] Fix runtime-profiler ticks for Interpreted functions.
Fix two bugs with the runtime-profiler optimization heuristics for interpreted code: - Reset shared->tick_count for interpreted functions when optimizing - Update ticks after checking whether to optimize functions, to be the same as the FCG profiler checks (where updates are done to the code ticks after deciding whether to optimize). BUG=chromium:662071 Review-Url: https://codereview.chromium.org/2497933002 Cr-Commit-Position: refs/heads/master@{#40978}
This commit is contained in:
parent
1bde83046e
commit
aed65cb45a
@ -640,8 +640,10 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
|
||||
}
|
||||
|
||||
// Reset profiler ticks, function is no longer considered hot.
|
||||
if (shared->is_compiled()) {
|
||||
if (shared->HasBaselineCode()) {
|
||||
shared->code()->set_profiler_ticks(0);
|
||||
} else if (shared->HasBytecodeArray()) {
|
||||
shared->set_profiler_ticks(0);
|
||||
}
|
||||
|
||||
VMState<COMPILER> state(isolate);
|
||||
@ -734,7 +736,13 @@ CompilationJob::Status FinalizeOptimizedCompilationJob(CompilationJob* job) {
|
||||
"V8.RecompileSynchronous");
|
||||
|
||||
Handle<SharedFunctionInfo> shared = info->shared_info();
|
||||
shared->code()->set_profiler_ticks(0);
|
||||
|
||||
// Reset profiler ticks, function is no longer considered hot.
|
||||
if (shared->HasBaselineCode()) {
|
||||
shared->code()->set_profiler_ticks(0);
|
||||
} else if (shared->HasBytecodeArray()) {
|
||||
shared->set_profiler_ticks(0);
|
||||
}
|
||||
|
||||
DCHECK(!shared->HasDebugInfo());
|
||||
|
||||
|
@ -22,7 +22,7 @@ namespace internal {
|
||||
|
||||
// Number of times a function has to be seen on the stack before it is
|
||||
// compiled for baseline.
|
||||
static const int kProfilerTicksBeforeBaseline = 1;
|
||||
static const int kProfilerTicksBeforeBaseline = 0;
|
||||
// Number of times a function has to be seen on the stack before it is
|
||||
// optimized.
|
||||
static const int kProfilerTicksBeforeOptimization = 2;
|
||||
@ -447,16 +447,6 @@ void RuntimeProfiler::MarkCandidatesForOptimization() {
|
||||
JavaScriptFrame* frame = it.frame();
|
||||
JSFunction* function = frame->function();
|
||||
|
||||
List<JSFunction*> functions(4);
|
||||
frame->GetFunctions(&functions);
|
||||
for (int i = functions.length(); --i >= 0; ) {
|
||||
SharedFunctionInfo* shared_function_info = functions[i]->shared();
|
||||
int ticks = shared_function_info->profiler_ticks();
|
||||
if (ticks < Smi::kMaxValue) {
|
||||
shared_function_info->set_profiler_ticks(ticks + 1);
|
||||
}
|
||||
}
|
||||
|
||||
Compiler::CompilationTier next_tier =
|
||||
Compiler::NextCompilationTier(function);
|
||||
if (function->shared()->IsInterpreted()) {
|
||||
@ -470,6 +460,19 @@ void RuntimeProfiler::MarkCandidatesForOptimization() {
|
||||
DCHECK_EQ(next_tier, Compiler::OPTIMIZED);
|
||||
MaybeOptimizeFullCodegen(function, frame, frame_count);
|
||||
}
|
||||
|
||||
// Update shared function info ticks after checking for whether functions
|
||||
// should be optimized to keep FCG (which updates ticks on code) and
|
||||
// Ignition (which updates ticks on shared function info) in sync.
|
||||
List<JSFunction*> functions(4);
|
||||
frame->GetFunctions(&functions);
|
||||
for (int i = functions.length(); --i >= 0;) {
|
||||
SharedFunctionInfo* shared_function_info = functions[i]->shared();
|
||||
int ticks = shared_function_info->profiler_ticks();
|
||||
if (ticks < Smi::kMaxValue) {
|
||||
shared_function_info->set_profiler_ticks(ticks + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
any_ic_changed_ = false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user