Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index ef21f1f46f9e65ff227bdefb703fe4132101c59e..d76913b319805de7d2aedf32874c0aa459764a88 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -331,6 +331,9 @@ class HOptimizedGraphBuilderWithPositions: public HOptimizedGraphBuilder { |
}; |
+OptimizedCompileJob::~OptimizedCompileJob() { delete pipeline_; } |
+ |
+ |
OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { |
DCHECK(info()->IsOptimizing()); |
DCHECK(!info()->IsCompilingForDebugging()); |
@@ -400,11 +403,12 @@ OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { |
} |
Timer t(this, &time_taken_to_create_graph_); |
- compiler::Pipeline pipeline(info()); |
- pipeline.GenerateCode(); |
- if (!info()->code().is_null()) { |
+ pipeline_ = new compiler::Pipeline(info()); |
+ if (pipeline_->CreateGraph()) { |
return SetLastStatus(SUCCEEDED); |
} |
+ delete pipeline_; |
+ pipeline_ = nullptr; |
} |
if (!isolate()->use_crankshaft() || dont_crankshaft) { |
@@ -482,12 +486,11 @@ OptimizedCompileJob::Status OptimizedCompileJob::OptimizeGraph() { |
DisallowCodeDependencyChange no_dependency_change; |
DCHECK(last_status() == SUCCEEDED); |
- // TODO(turbofan): Currently everything is done in the first phase. |
- if (!info()->code().is_null()) { |
- return last_status(); |
- } |
- |
Timer t(this, &time_taken_to_optimize_); |
+ if (pipeline_) { |
+ if (pipeline_->OptimizeGraph()) return SetLastStatus(SUCCEEDED); |
+ return SetLastStatus(BAILED_OUT); |
+ } |
DCHECK(graph_ != NULL); |
BailoutReason bailout_reason = kNoReason; |
@@ -504,22 +507,23 @@ OptimizedCompileJob::Status OptimizedCompileJob::OptimizeGraph() { |
OptimizedCompileJob::Status OptimizedCompileJob::GenerateCode() { |
DCHECK(last_status() == SUCCEEDED); |
- // TODO(turbofan): Currently everything is done in the first phase. |
- if (!info()->code().is_null()) { |
- info()->dependencies()->Commit(info()->code()); |
- if (info()->is_deoptimization_enabled()) { |
- info()->parse_info()->context()->native_context()->AddOptimizedCode( |
- *info()->code()); |
- } |
- RecordOptimizationStats(); |
- return last_status(); |
- } |
- |
DCHECK(!info()->dependencies()->HasAborted()); |
DisallowCodeDependencyChange no_dependency_change; |
DisallowJavascriptExecution no_js(isolate()); |
{ // Scope for timer. |
Timer timer(this, &time_taken_to_codegen_); |
+ if (pipeline_) { |
+ Handle<Code> optimized_code = pipeline_->CreateCode(); |
+ if (optimized_code.is_null()) return SetLastStatus(BAILED_OUT); |
+ DCHECK(optimized_code.is_identical_to(info()->code())); |
+ info()->dependencies()->Commit(info()->code()); |
+ if (info()->is_deoptimization_enabled()) { |
+ info()->parse_info()->context()->native_context()->AddOptimizedCode( |
+ *info()->code()); |
+ } |
+ RecordOptimizationStats(); |
+ return SetLastStatus(SUCCEEDED); |
+ } |
DCHECK(chunk_ != NULL); |
DCHECK(graph_ != NULL); |
// Deferred handles reference objects that were accessible during |
@@ -1513,6 +1517,8 @@ Handle<Code> Compiler::GetConcurrentlyOptimizedCode(OptimizedCompileJob* job) { |
info->closure()->ShortPrint(); |
PrintF("]\n"); |
} |
+ // TODO(bmeurer): Improve resource management for OptimizedCompileJob. |
+ job->~OptimizedCompileJob(); |
return Handle<Code>(*info->code()); |
} |
} |
@@ -1523,6 +1529,8 @@ Handle<Code> Compiler::GetConcurrentlyOptimizedCode(OptimizedCompileJob* job) { |
info->closure()->ShortPrint(); |
PrintF(" because: %s]\n", GetBailoutReason(info->bailout_reason())); |
} |
+ // TODO(bmeurer): Improve resource management for OptimizedCompileJob. |
+ job->~OptimizedCompileJob(); |
return Handle<Code>::null(); |
} |