| 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();
|
| }
|
|
|
|
|