| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/pipeline.h" | 5 #include "src/compiler/pipeline.h" |
| 6 | 6 |
| 7 #include <fstream> // NOLINT(readability/streams) | 7 #include <fstream> // NOLINT(readability/streams) |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "src/base/adapters.h" | 10 #include "src/base/adapters.h" |
| 11 #include "src/base/platform/elapsed-timer.h" | 11 #include "src/base/platform/elapsed-timer.h" |
| 12 #include "src/compiler/ast-graph-builder.h" | 12 #include "src/compiler/ast-graph-builder.h" |
| 13 #include "src/compiler/ast-loop-assignment-analyzer.h" | 13 #include "src/compiler/ast-loop-assignment-analyzer.h" |
| 14 #include "src/compiler/basic-block-instrumentor.h" | 14 #include "src/compiler/basic-block-instrumentor.h" |
| 15 #include "src/compiler/branch-elimination.h" | 15 #include "src/compiler/branch-elimination.h" |
| 16 #include "src/compiler/bytecode-graph-builder.h" | 16 #include "src/compiler/bytecode-graph-builder.h" |
| 17 #include "src/compiler/change-lowering.h" | 17 #include "src/compiler/change-lowering.h" |
| 18 #include "src/compiler/code-generator.h" | 18 #include "src/compiler/code-generator.h" |
| 19 #include "src/compiler/common-operator-reducer.h" | 19 #include "src/compiler/common-operator-reducer.h" |
| 20 #include "src/compiler/control-flow-optimizer.h" | 20 #include "src/compiler/control-flow-optimizer.h" |
| 21 #include "src/compiler/dead-code-elimination.h" | 21 #include "src/compiler/dead-code-elimination.h" |
| 22 #include "src/compiler/escape-analysis-reducer.h" |
| 22 #include "src/compiler/escape-analysis.h" | 23 #include "src/compiler/escape-analysis.h" |
| 23 #include "src/compiler/escape-analysis-reducer.h" | |
| 24 #include "src/compiler/frame-elider.h" | 24 #include "src/compiler/frame-elider.h" |
| 25 #include "src/compiler/graph-replay.h" | 25 #include "src/compiler/graph-replay.h" |
| 26 #include "src/compiler/graph-trimmer.h" | 26 #include "src/compiler/graph-trimmer.h" |
| 27 #include "src/compiler/graph-visualizer.h" | 27 #include "src/compiler/graph-visualizer.h" |
| 28 #include "src/compiler/greedy-allocator.h" | 28 #include "src/compiler/greedy-allocator.h" |
| 29 #include "src/compiler/instruction-selector.h" |
| 29 #include "src/compiler/instruction.h" | 30 #include "src/compiler/instruction.h" |
| 30 #include "src/compiler/instruction-selector.h" | |
| 31 #include "src/compiler/js-builtin-reducer.h" | 31 #include "src/compiler/js-builtin-reducer.h" |
| 32 #include "src/compiler/js-call-reducer.h" | 32 #include "src/compiler/js-call-reducer.h" |
| 33 #include "src/compiler/js-context-specialization.h" | 33 #include "src/compiler/js-context-specialization.h" |
| 34 #include "src/compiler/js-create-lowering.h" | 34 #include "src/compiler/js-create-lowering.h" |
| 35 #include "src/compiler/js-frame-specialization.h" | 35 #include "src/compiler/js-frame-specialization.h" |
| 36 #include "src/compiler/js-generic-lowering.h" | 36 #include "src/compiler/js-generic-lowering.h" |
| 37 #include "src/compiler/js-global-object-specialization.h" | 37 #include "src/compiler/js-global-object-specialization.h" |
| 38 #include "src/compiler/js-inlining-heuristic.h" | 38 #include "src/compiler/js-inlining-heuristic.h" |
| 39 #include "src/compiler/js-intrinsic-lowering.h" | 39 #include "src/compiler/js-intrinsic-lowering.h" |
| 40 #include "src/compiler/js-native-context-specialization.h" | 40 #include "src/compiler/js-native-context-specialization.h" |
| 41 #include "src/compiler/js-typed-lowering.h" | 41 #include "src/compiler/js-typed-lowering.h" |
| 42 #include "src/compiler/jump-threading.h" | 42 #include "src/compiler/jump-threading.h" |
| 43 #include "src/compiler/live-range-separator.h" | 43 #include "src/compiler/live-range-separator.h" |
| 44 #include "src/compiler/load-elimination.h" | 44 #include "src/compiler/load-elimination.h" |
| 45 #include "src/compiler/loop-analysis.h" | 45 #include "src/compiler/loop-analysis.h" |
| 46 #include "src/compiler/loop-peeling.h" | 46 #include "src/compiler/loop-peeling.h" |
| 47 #include "src/compiler/machine-operator-reducer.h" | 47 #include "src/compiler/machine-operator-reducer.h" |
| 48 #include "src/compiler/move-optimizer.h" | 48 #include "src/compiler/move-optimizer.h" |
| 49 #include "src/compiler/osr.h" | 49 #include "src/compiler/osr.h" |
| 50 #include "src/compiler/pipeline-statistics.h" | 50 #include "src/compiler/pipeline-statistics.h" |
| 51 #include "src/compiler/register-allocator-verifier.h" |
| 51 #include "src/compiler/register-allocator.h" | 52 #include "src/compiler/register-allocator.h" |
| 52 #include "src/compiler/register-allocator-verifier.h" | |
| 53 #include "src/compiler/schedule.h" | 53 #include "src/compiler/schedule.h" |
| 54 #include "src/compiler/scheduler.h" | 54 #include "src/compiler/scheduler.h" |
| 55 #include "src/compiler/select-lowering.h" | 55 #include "src/compiler/select-lowering.h" |
| 56 #include "src/compiler/simplified-lowering.h" | 56 #include "src/compiler/simplified-lowering.h" |
| 57 #include "src/compiler/simplified-operator-reducer.h" |
| 57 #include "src/compiler/simplified-operator.h" | 58 #include "src/compiler/simplified-operator.h" |
| 58 #include "src/compiler/simplified-operator-reducer.h" | |
| 59 #include "src/compiler/tail-call-optimization.h" | 59 #include "src/compiler/tail-call-optimization.h" |
| 60 #include "src/compiler/type-hint-analyzer.h" | 60 #include "src/compiler/type-hint-analyzer.h" |
| 61 #include "src/compiler/typer.h" | 61 #include "src/compiler/typer.h" |
| 62 #include "src/compiler/value-numbering-reducer.h" | 62 #include "src/compiler/value-numbering-reducer.h" |
| 63 #include "src/compiler/verifier.h" | 63 #include "src/compiler/verifier.h" |
| 64 #include "src/compiler/zone-pool.h" | 64 #include "src/compiler/zone-pool.h" |
| 65 #include "src/isolate-inl.h" |
| 65 #include "src/ostreams.h" | 66 #include "src/ostreams.h" |
| 66 #include "src/register-configuration.h" | 67 #include "src/register-configuration.h" |
| 67 #include "src/type-info.h" | 68 #include "src/type-info.h" |
| 68 #include "src/utils.h" | 69 #include "src/utils.h" |
| 69 | 70 |
| 70 namespace v8 { | 71 namespace v8 { |
| 71 namespace internal { | 72 namespace internal { |
| 72 namespace compiler { | 73 namespace compiler { |
| 73 | 74 |
| 74 class PipelineData { | 75 class PipelineData { |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 phase_name), | 470 phase_name), |
| 470 zone_scope_(data->zone_pool()) {} | 471 zone_scope_(data->zone_pool()) {} |
| 471 | 472 |
| 472 Zone* zone() { return zone_scope_.zone(); } | 473 Zone* zone() { return zone_scope_.zone(); } |
| 473 | 474 |
| 474 private: | 475 private: |
| 475 PhaseScope phase_scope_; | 476 PhaseScope phase_scope_; |
| 476 ZonePool::Scope zone_scope_; | 477 ZonePool::Scope zone_scope_; |
| 477 }; | 478 }; |
| 478 | 479 |
| 480 class PipelineCompilationJob : public OptimizedCompileJob { |
| 481 public: |
| 482 explicit PipelineCompilationJob(CompilationInfo* info) |
| 483 : OptimizedCompileJob(info) {} |
| 484 |
| 485 protected: |
| 486 virtual Status CreateGraphImpl(); |
| 487 virtual Status OptimizeGraphImpl(); |
| 488 virtual Status GenerateCodeImpl(); |
| 489 }; |
| 490 |
| 491 PipelineCompilationJob::Status PipelineCompilationJob::CreateGraphImpl() { |
| 492 if (FLAG_trace_opt) { |
| 493 OFStream os(stdout); |
| 494 os << "[compiling method " << Brief(*info()->closure()) |
| 495 << " using TurboFan"; |
| 496 if (info()->is_osr()) os << " OSR"; |
| 497 os << "]" << std::endl; |
| 498 } |
| 499 |
| 500 if (info()->shared_info()->asm_function()) { |
| 501 if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); |
| 502 info()->MarkAsFunctionContextSpecializing(); |
| 503 } else { |
| 504 if (!FLAG_always_opt) { |
| 505 info()->MarkAsBailoutOnUninitialized(); |
| 506 } |
| 507 if (FLAG_native_context_specialization) { |
| 508 info()->MarkAsNativeContextSpecializing(); |
| 509 info()->MarkAsTypingEnabled(); |
| 510 } |
| 511 } |
| 512 if (!info()->shared_info()->asm_function() || FLAG_turbo_asm_deoptimization) { |
| 513 info()->MarkAsDeoptimizationEnabled(); |
| 514 } |
| 515 |
| 516 Pipeline pipeline(info()); |
| 517 pipeline.GenerateCode(); |
| 518 if (isolate()->has_pending_exception()) return FAILED; // Stack overflowed. |
| 519 if (info()->code().is_null()) return AbortOptimization(kGraphBuildingFailed); |
| 520 |
| 521 return SUCCEEDED; |
| 522 } |
| 523 |
| 524 PipelineCompilationJob::Status PipelineCompilationJob::OptimizeGraphImpl() { |
| 525 // TODO(turbofan): Currently everything is done in the first phase. |
| 526 DCHECK(!info()->code().is_null()); |
| 527 return SUCCEEDED; |
| 528 } |
| 529 |
| 530 PipelineCompilationJob::Status PipelineCompilationJob::GenerateCodeImpl() { |
| 531 // TODO(turbofan): Currently everything is done in the first phase. |
| 532 DCHECK(!info()->code().is_null()); |
| 533 info()->dependencies()->Commit(info()->code()); |
| 534 if (info()->is_deoptimization_enabled()) { |
| 535 info()->context()->native_context()->AddOptimizedCode(*info()->code()); |
| 536 RegisterWeakObjectsInOptimizedCode(info()->code()); |
| 537 } |
| 538 return SUCCEEDED; |
| 539 } |
| 540 |
| 479 } // namespace | 541 } // namespace |
| 480 | 542 |
| 481 | 543 |
| 482 template <typename Phase> | 544 template <typename Phase> |
| 483 void Pipeline::Run() { | 545 void Pipeline::Run() { |
| 484 PipelineRunScope scope(this->data_, Phase::phase_name()); | 546 PipelineRunScope scope(this->data_, Phase::phase_name()); |
| 485 Phase phase; | 547 Phase phase; |
| 486 phase.Run(this->data_, scope.zone()); | 548 phase.Run(this->data_, scope.zone()); |
| 487 } | 549 } |
| 488 | 550 |
| (...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1306 Pipeline pipeline(info); | 1368 Pipeline pipeline(info); |
| 1307 pipeline.data_ = &data; | 1369 pipeline.data_ = &data; |
| 1308 if (data.schedule() == nullptr) { | 1370 if (data.schedule() == nullptr) { |
| 1309 // TODO(rossberg): Should this really be untyped? | 1371 // TODO(rossberg): Should this really be untyped? |
| 1310 pipeline.RunPrintAndVerify("Machine", true); | 1372 pipeline.RunPrintAndVerify("Machine", true); |
| 1311 } | 1373 } |
| 1312 | 1374 |
| 1313 return pipeline.ScheduleAndGenerateCode(call_descriptor); | 1375 return pipeline.ScheduleAndGenerateCode(call_descriptor); |
| 1314 } | 1376 } |
| 1315 | 1377 |
| 1378 OptimizedCompileJob* Pipeline::NewCompilationJob(CompilationInfo* info) { |
| 1379 return new (info->zone()) PipelineCompilationJob(info); |
| 1380 } |
| 1316 | 1381 |
| 1317 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, | 1382 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, |
| 1318 InstructionSequence* sequence, | 1383 InstructionSequence* sequence, |
| 1319 bool run_verifier) { | 1384 bool run_verifier) { |
| 1320 CompilationInfo info("testing", sequence->isolate(), sequence->zone()); | 1385 CompilationInfo info("testing", sequence->isolate(), sequence->zone()); |
| 1321 ZonePool zone_pool(sequence->isolate()->allocator()); | 1386 ZonePool zone_pool(sequence->isolate()->allocator()); |
| 1322 PipelineData data(&zone_pool, &info, sequence); | 1387 PipelineData data(&zone_pool, &info, sequence); |
| 1323 Pipeline pipeline(&info); | 1388 Pipeline pipeline(&info); |
| 1324 pipeline.data_ = &data; | 1389 pipeline.data_ = &data; |
| 1325 pipeline.data_->InitializeFrameData(nullptr); | 1390 pipeline.data_->InitializeFrameData(nullptr); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 } | 1586 } |
| 1522 | 1587 |
| 1523 data->DeleteRegisterAllocationZone(); | 1588 data->DeleteRegisterAllocationZone(); |
| 1524 } | 1589 } |
| 1525 | 1590 |
| 1526 Isolate* Pipeline::isolate() const { return info()->isolate(); } | 1591 Isolate* Pipeline::isolate() const { return info()->isolate(); } |
| 1527 | 1592 |
| 1528 } // namespace compiler | 1593 } // namespace compiler |
| 1529 } // namespace internal | 1594 } // namespace internal |
| 1530 } // namespace v8 | 1595 } // namespace v8 |
| OLD | NEW |