Index: src/optimizing-compiler-thread.cc |
diff --git a/src/optimizing-compiler-thread.cc b/src/optimizing-compiler-thread.cc |
index 32a7f971401b65e7521b94edccc114bf0c8ec0d6..d21507084c5f9d0de5d3eba72831f0f464665329 100644 |
--- a/src/optimizing-compiler-thread.cc |
+++ b/src/optimizing-compiler-thread.cc |
@@ -106,10 +106,10 @@ void OptimizingCompilerThread::Run() { |
} |
-RecompileJob* OptimizingCompilerThread::NextInput() { |
+OptimizedCompileJob* OptimizingCompilerThread::NextInput() { |
LockGuard<Mutex> access_input_queue_(&input_queue_mutex_); |
if (input_queue_length_ == 0) return NULL; |
- RecompileJob* job = input_queue_[InputQueueIndex(0)]; |
+ OptimizedCompileJob* job = input_queue_[InputQueueIndex(0)]; |
ASSERT_NE(NULL, job); |
input_queue_shift_ = InputQueueIndex(1); |
input_queue_length_--; |
@@ -118,13 +118,13 @@ RecompileJob* OptimizingCompilerThread::NextInput() { |
void OptimizingCompilerThread::CompileNext() { |
- RecompileJob* job = NextInput(); |
+ OptimizedCompileJob* job = NextInput(); |
ASSERT_NE(NULL, job); |
// The function may have already been optimized by OSR. Simply continue. |
- RecompileJob::Status status = job->OptimizeGraph(); |
+ OptimizedCompileJob::Status status = job->OptimizeGraph(); |
USE(status); // Prevent an unused-variable error in release mode. |
- ASSERT(status != RecompileJob::FAILED); |
+ ASSERT(status != OptimizedCompileJob::FAILED); |
// The function may have already been optimized by OSR. Simply continue. |
// Use a mutex to make sure that functions marked for install |
@@ -134,13 +134,18 @@ void OptimizingCompilerThread::CompileNext() { |
} |
-static void DisposeRecompileJob(RecompileJob* job, |
- bool restore_function_code) { |
+static void DisposeOptimizedCompileJob(OptimizedCompileJob* job, |
+ bool restore_function_code) { |
// The recompile job is allocated in the CompilationInfo's zone. |
CompilationInfo* info = job->info(); |
if (restore_function_code) { |
if (info->is_osr()) { |
- if (!job->IsWaitingForInstall()) BackEdgeTable::RemoveStackCheck(info); |
+ if (!job->IsWaitingForInstall()) { |
+ // Remove stack check that guards OSR entry on original code. |
+ Handle<Code> code = info->unoptimized_code(); |
+ uint32_t offset = code->TranslateAstIdToPcOffset(info->osr_ast_id()); |
+ BackEdgeTable::RemoveStackCheck(code, offset); |
+ } |
} else { |
Handle<JSFunction> function = info->closure(); |
function->ReplaceCode(function->shared()->code()); |
@@ -151,25 +156,25 @@ static void DisposeRecompileJob(RecompileJob* job, |
void OptimizingCompilerThread::FlushInputQueue(bool restore_function_code) { |
- RecompileJob* job; |
+ OptimizedCompileJob* job; |
while ((job = NextInput())) { |
// This should not block, since we have one signal on the input queue |
// semaphore corresponding to each element in the input queue. |
input_queue_semaphore_.Wait(); |
// OSR jobs are dealt with separately. |
if (!job->info()->is_osr()) { |
- DisposeRecompileJob(job, restore_function_code); |
+ DisposeOptimizedCompileJob(job, restore_function_code); |
} |
} |
} |
void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) { |
- RecompileJob* job; |
+ OptimizedCompileJob* job; |
while (output_queue_.Dequeue(&job)) { |
// OSR jobs are dealt with separately. |
if (!job->info()->is_osr()) { |
- DisposeRecompileJob(job, restore_function_code); |
+ DisposeOptimizedCompileJob(job, restore_function_code); |
} |
} |
} |
@@ -178,7 +183,7 @@ void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) { |
void OptimizingCompilerThread::FlushOsrBuffer(bool restore_function_code) { |
for (int i = 0; i < osr_buffer_capacity_; i++) { |
if (osr_buffer_[i] != NULL) { |
- DisposeRecompileJob(osr_buffer_[i], restore_function_code); |
+ DisposeOptimizedCompileJob(osr_buffer_[i], restore_function_code); |
osr_buffer_[i] = NULL; |
} |
} |
@@ -236,9 +241,10 @@ void OptimizingCompilerThread::InstallOptimizedFunctions() { |
ASSERT(!IsOptimizerThread()); |
HandleScope handle_scope(isolate_); |
- RecompileJob* job; |
+ OptimizedCompileJob* job; |
while (output_queue_.Dequeue(&job)) { |
CompilationInfo* info = job->info(); |
+ Handle<JSFunction> function(*info->closure()); |
if (info->is_osr()) { |
if (FLAG_trace_osr) { |
PrintF("[COSR - "); |
@@ -247,26 +253,25 @@ void OptimizingCompilerThread::InstallOptimizedFunctions() { |
info->osr_ast_id().ToInt()); |
} |
job->WaitForInstall(); |
- BackEdgeTable::RemoveStackCheck(info); |
+ // Remove stack check that guards OSR entry on original code. |
+ Handle<Code> code = info->unoptimized_code(); |
+ uint32_t offset = code->TranslateAstIdToPcOffset(info->osr_ast_id()); |
+ BackEdgeTable::RemoveStackCheck(code, offset); |
} else { |
- Compiler::InstallOptimizedCode(job); |
+ Handle<Code> code = Compiler::GetConcurrentlyOptimizedCode(job); |
+ function->ReplaceCode( |
+ code.is_null() ? function->shared()->code() : *code); |
} |
} |
} |
-void OptimizingCompilerThread::QueueForOptimization(RecompileJob* job) { |
+void OptimizingCompilerThread::QueueForOptimization(OptimizedCompileJob* job) { |
ASSERT(IsQueueAvailable()); |
ASSERT(!IsOptimizerThread()); |
CompilationInfo* info = job->info(); |
if (info->is_osr()) { |
- if (FLAG_trace_concurrent_recompilation) { |
- PrintF(" ** Queueing "); |
- info->closure()->PrintName(); |
- PrintF(" for concurrent on-stack replacement.\n"); |
- } |
osr_attempts_++; |
- BackEdgeTable::AddStackCheck(info); |
AddToOsrBuffer(job); |
// Add job to the front of the input queue. |
LockGuard<Mutex> access_input_queue(&input_queue_mutex_); |
@@ -276,7 +281,6 @@ void OptimizingCompilerThread::QueueForOptimization(RecompileJob* job) { |
input_queue_[InputQueueIndex(0)] = job; |
input_queue_length_++; |
} else { |
- info->closure()->MarkInRecompileQueue(); |
// Add job to the back of the input queue. |
LockGuard<Mutex> access_input_queue(&input_queue_mutex_); |
ASSERT_LT(input_queue_length_, input_queue_capacity_); |
@@ -300,14 +304,14 @@ void OptimizingCompilerThread::Unblock() { |
} |
-RecompileJob* OptimizingCompilerThread::FindReadyOSRCandidate( |
- Handle<JSFunction> function, uint32_t osr_pc_offset) { |
+OptimizedCompileJob* OptimizingCompilerThread::FindReadyOSRCandidate( |
+ Handle<JSFunction> function, BailoutId osr_ast_id) { |
ASSERT(!IsOptimizerThread()); |
for (int i = 0; i < osr_buffer_capacity_; i++) { |
- RecompileJob* current = osr_buffer_[i]; |
+ OptimizedCompileJob* current = osr_buffer_[i]; |
if (current != NULL && |
current->IsWaitingForInstall() && |
- current->info()->HasSameOsrEntry(function, osr_pc_offset)) { |
+ current->info()->HasSameOsrEntry(function, osr_ast_id)) { |
osr_hits_++; |
osr_buffer_[i] = NULL; |
return current; |
@@ -318,12 +322,12 @@ RecompileJob* OptimizingCompilerThread::FindReadyOSRCandidate( |
bool OptimizingCompilerThread::IsQueuedForOSR(Handle<JSFunction> function, |
- uint32_t osr_pc_offset) { |
+ BailoutId osr_ast_id) { |
ASSERT(!IsOptimizerThread()); |
for (int i = 0; i < osr_buffer_capacity_; i++) { |
- RecompileJob* current = osr_buffer_[i]; |
+ OptimizedCompileJob* current = osr_buffer_[i]; |
if (current != NULL && |
- current->info()->HasSameOsrEntry(function, osr_pc_offset)) { |
+ current->info()->HasSameOsrEntry(function, osr_ast_id)) { |
return !current->IsWaitingForInstall(); |
} |
} |
@@ -334,7 +338,7 @@ bool OptimizingCompilerThread::IsQueuedForOSR(Handle<JSFunction> function, |
bool OptimizingCompilerThread::IsQueuedForOSR(JSFunction* function) { |
ASSERT(!IsOptimizerThread()); |
for (int i = 0; i < osr_buffer_capacity_; i++) { |
- RecompileJob* current = osr_buffer_[i]; |
+ OptimizedCompileJob* current = osr_buffer_[i]; |
if (current != NULL && *current->info()->closure() == function) { |
return !current->IsWaitingForInstall(); |
} |
@@ -343,10 +347,10 @@ bool OptimizingCompilerThread::IsQueuedForOSR(JSFunction* function) { |
} |
-void OptimizingCompilerThread::AddToOsrBuffer(RecompileJob* job) { |
+void OptimizingCompilerThread::AddToOsrBuffer(OptimizedCompileJob* job) { |
ASSERT(!IsOptimizerThread()); |
// Find the next slot that is empty or has a stale job. |
- RecompileJob* stale = NULL; |
+ OptimizedCompileJob* stale = NULL; |
while (true) { |
stale = osr_buffer_[osr_buffer_cursor_]; |
if (stale == NULL || stale->IsWaitingForInstall()) break; |
@@ -362,7 +366,7 @@ void OptimizingCompilerThread::AddToOsrBuffer(RecompileJob* job) { |
info->closure()->PrintName(); |
PrintF(", AST id %d]\n", info->osr_ast_id().ToInt()); |
} |
- DisposeRecompileJob(stale, false); |
+ DisposeOptimizedCompileJob(stale, false); |
} |
osr_buffer_[osr_buffer_cursor_] = job; |
osr_buffer_cursor_ = (osr_buffer_cursor_ + 1) % osr_buffer_capacity_; |