Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index a2060662367b84f45e929a0deec57dad94392b7d..cf8bfcfc8fcad4fdf1b271a69f6bc49f9585b8b2 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -358,7 +358,7 @@ OptimizingCompiler::Status OptimizingCompiler::CreateGraph() { |
} |
const int locals_limit = LUnallocated::kMaxFixedSlotIndex; |
- if (!info()->osr_ast_id().IsNone() && |
+ if (info()->is_osr() && |
scope->num_parameters() + 1 + scope->num_stack_slots() > locals_limit) { |
info()->set_bailout_reason(kTooManyParametersLocals); |
return AbortOptimization(); |
@@ -884,7 +884,7 @@ static void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { |
if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. |
// Cache non-OSR optimized code. |
- if (FLAG_cache_optimized_code && info->osr_ast_id().IsNone()) { |
+ if (FLAG_cache_optimized_code && !info->is_osr()) { |
Handle<JSFunction> function = info->closure(); |
Handle<SharedFunctionInfo> shared(function->shared()); |
Handle<FixedArray> literals(function->literals()); |
@@ -899,7 +899,7 @@ static bool InstallCodeFromOptimizedCodeMap(CompilationInfo* info) { |
if (!info->IsOptimizing()) return false; // Nothing to look up. |
// Lookup non-OSR optimized code. |
- if (FLAG_cache_optimized_code && info->osr_ast_id().IsNone()) { |
+ if (FLAG_cache_optimized_code && !info->is_osr()) { |
Handle<SharedFunctionInfo> shared = info->shared_info(); |
Handle<JSFunction> function = info->closure(); |
ASSERT(!function.is_null()); |
@@ -955,12 +955,15 @@ bool Compiler::CompileLazy(CompilationInfo* info) { |
InstallCodeCommon(info); |
if (info->IsOptimizing()) { |
+ // Optimized code successfully created. |
Handle<Code> code = info->code(); |
ASSERT(shared->scope_info() != ScopeInfo::Empty(isolate)); |
+ // TODO(titzer): Only replace the code if it was not an OSR compile. |
info->closure()->ReplaceCode(*code); |
InsertCodeIntoOptimizedCodeMap(info); |
return true; |
- } else { |
+ } else if (!info->is_osr()) { |
+ // Compilation failed. Replace with full code if not OSR compile. |
return InstallFullCode(info); |
} |
} |
@@ -1149,10 +1152,9 @@ static bool IsSuitableForOnStackReplacement(Isolate* isolate, |
} |
-BailoutId Compiler::CompileForOnStackReplacement(Handle<JSFunction> function) { |
+Handle<Code> Compiler::CompileForOnStackReplacement( |
+ Handle<JSFunction> function) { |
Isolate* isolate = function->GetIsolate(); |
- // We have hit a back edge in an unoptimized frame for a function that was |
- // selected for on-stack replacement. Find the unoptimized code object. |
Handle<Code> unoptimized(function->shared()->code(), isolate); |
Deoptimizer::RevertInterruptCode(isolate, *unoptimized); |
@@ -1162,49 +1164,47 @@ BailoutId Compiler::CompileForOnStackReplacement(Handle<JSFunction> function) { |
PrintF("]\n"); |
} |
- if (!IsSuitableForOnStackReplacement(isolate, function, unoptimized)) { |
- return BailoutId::None(); |
- } |
- |
- uint32_t pc_offset = CurrentPcOffset(isolate, function, unoptimized); |
+ if (IsSuitableForOnStackReplacement(isolate, function, unoptimized)) { |
+ // Find the PC offset in unoptimized code and translate to an AST id. |
+ uint32_t pc_offset = CurrentPcOffset(isolate, function, unoptimized); |
+ BailoutId ast_id = unoptimized->TranslatePcOffsetToAstId(pc_offset); |
+ ASSERT(!ast_id.IsNone()); |
+ if (FLAG_trace_osr) { |
+ PrintF("[OSR - replacing at AST id %d in ", ast_id.ToInt()); |
+ function->PrintName(); |
+ PrintF("]\n"); |
+ } |
- BailoutId ast_id = unoptimized->TranslatePcOffsetToAstId(pc_offset); |
- ASSERT(!ast_id.IsNone()); |
- if (FLAG_trace_osr) { |
- PrintF("[OSR - replacing at AST id %d in ", ast_id.ToInt()); |
- function->PrintName(); |
- PrintF("]\n"); |
- } |
+ // Attempt OSR compilation. |
+ Handle<Code> result = JSFunction::CompileOsr( |
+ function, ast_id, CLEAR_EXCEPTION); |
- // Try to compile the optimized code. A true return value from |
- // CompileOptimized means that compilation succeeded, not necessarily |
- // that optimization succeeded. |
- if (JSFunction::CompileOptimized(function, ast_id, CLEAR_EXCEPTION) && |
- function->IsOptimized()) { |
- DeoptimizationInputData* data = DeoptimizationInputData::cast( |
- function->code()->deoptimization_data()); |
- if (data->OsrPcOffset()->value() >= 0) { |
+ if (!result.is_null() && result->kind() == Code::OPTIMIZED_FUNCTION) { |
+ // OSR compilation succeeded. |
+ DeoptimizationInputData* data = |
+ DeoptimizationInputData::cast(result->deoptimization_data()); |
if (FLAG_trace_osr) { |
PrintF("[OSR - entry, offset %d in optimized code]\n", |
data->OsrPcOffset()->value()); |
} |
ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id); |
- return ast_id; |
- } |
- } else { |
- if (FLAG_trace_osr) { |
- PrintF("[OSR - optimization failed for "); |
- function->PrintName(); |
- PrintF("]\n"); |
+ return result; |
} |
} |
- return BailoutId::None(); |
+ |
+ if (FLAG_trace_osr) { |
+ PrintF("[OSR - attempt failed for "); |
+ function->PrintName(); |
+ PrintF("]\n"); |
+ } |
+ return Handle<Code>::null(); |
} |
-BailoutId Compiler::CompileForConcurrentOSR(Handle<JSFunction> function) { |
+Handle<Code> Compiler::CompileForConcurrentOSR(Handle<JSFunction> function) { |
Isolate* isolate = function->GetIsolate(); |
Handle<Code> unoptimized(function->shared()->code(), isolate); |
+ Handle<Code> result = Handle<Code>::null(); |
uint32_t pc_offset = CurrentPcOffset(isolate, function, unoptimized); |
@@ -1216,7 +1216,7 @@ BailoutId Compiler::CompileForConcurrentOSR(Handle<JSFunction> function) { |
function->PrintName(); |
PrintF("]\n"); |
} |
- return BailoutId::None(); |
+ return result; // return null. |
Michael Starzinger
2013/09/09 15:34:44
nit: Can we just write down "Handle<Code>::null()"
|
} |
OptimizingCompiler* compiler = isolate->optimizing_compiler_thread()-> |
@@ -1230,8 +1230,7 @@ BailoutId Compiler::CompileForConcurrentOSR(Handle<JSFunction> function) { |
} |
Deoptimizer::RevertInterruptCode(isolate, *unoptimized); |
- BailoutId ast_id = compiler->info()->osr_ast_id(); |
- |
+ // TODO(titzer): don't install the OSR code into the function. |
bool succeeded = InstallOptimizedCode(compiler); |
isolate->optimizing_compiler_thread()->RemoveStaleOSRCandidates(); |
@@ -1242,21 +1241,26 @@ BailoutId Compiler::CompileForConcurrentOSR(Handle<JSFunction> function) { |
function->PrintName(); |
PrintF("]\n"); |
} |
- return BailoutId::None(); |
+ return result; |
Michael Starzinger
2013/09/09 15:34:44
Likewise.
|
} |
- |
- DeoptimizationInputData* data = DeoptimizationInputData::cast( |
- function->code()->deoptimization_data()); |
- |
- if (data->OsrPcOffset()->value() >= 0) { |
- ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id); |
- if (FLAG_trace_osr) { |
- PrintF("[COSR - entry at AST id %d, offset %d in optimized code]\n", |
- ast_id.ToInt(), data->OsrPcOffset()->value()); |
+ result = compiler->info()->code(); |
+ |
+ // Check the result matches our expectations, and don't use it otherwise. |
+ if (result->kind() == Code::OPTIMIZED_FUNCTION) { |
+ DeoptimizationInputData* data = |
+ DeoptimizationInputData::cast(result->deoptimization_data()); |
+ |
+ if (data->OsrPcOffset()->value() >= 0) { |
+ BailoutId ast_id = compiler->info()->osr_ast_id(); |
+ ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id); |
+ if (FLAG_trace_osr) { |
+ PrintF("[COSR - entry at AST id %d, offset %d in optimized code]\n", |
+ ast_id.ToInt(), data->OsrPcOffset()->value()); |
+ } |
+ return result; |
} |
- return ast_id; |
} |
- return BailoutId::None(); |
+ return Handle<Code>::null(); |
} |
if (!IsSuitableForOnStackReplacement(isolate, function, unoptimized)) { |
@@ -1266,13 +1270,13 @@ BailoutId Compiler::CompileForConcurrentOSR(Handle<JSFunction> function) { |
PrintF(" is unsuitable, restoring interrupt calls]\n"); |
} |
Deoptimizer::RevertInterruptCode(isolate, *unoptimized); |
- return BailoutId::None(); |
+ return Handle<Code>::null(); |
} |
if (!RecompileConcurrent(function, pc_offset)) { |
Deoptimizer::RevertInterruptCode(isolate, *unoptimized); |
} |
- return BailoutId::None(); |
+ return Handle<Code>::null(); |
} |