| 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" |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 } | 352 } |
| 353 return descriptor->IsCFunctionCall() | 353 return descriptor->IsCFunctionCall() |
| 354 ? (CommonFrameConstants::kFixedSlotCountAboveFp + | 354 ? (CommonFrameConstants::kFixedSlotCountAboveFp + |
| 355 CommonFrameConstants::kCPSlotCount) | 355 CommonFrameConstants::kCPSlotCount) |
| 356 : TypedFrameConstants::kFixedSlotCount; | 356 : TypedFrameConstants::kFixedSlotCount; |
| 357 } | 357 } |
| 358 | 358 |
| 359 DISALLOW_COPY_AND_ASSIGN(PipelineData); | 359 DISALLOW_COPY_AND_ASSIGN(PipelineData); |
| 360 }; | 360 }; |
| 361 | 361 |
| 362 class PipelineImpl final { |
| 363 public: |
| 364 explicit PipelineImpl(PipelineData* data) : data_(data) {} |
| 365 |
| 366 // Helpers for executing pipeline phases. |
| 367 template <typename Phase> |
| 368 void Run(); |
| 369 template <typename Phase, typename Arg0> |
| 370 void Run(Arg0 arg_0); |
| 371 template <typename Phase, typename Arg0, typename Arg1> |
| 372 void Run(Arg0 arg_0, Arg1 arg_1); |
| 373 |
| 374 // Run the graph creation and initial optimization passes. |
| 375 bool CreateGraph(); |
| 376 |
| 377 // Run the concurrent optimization passes. |
| 378 bool OptimizeGraph(Linkage* linkage); |
| 379 |
| 380 // Perform the actual code generation and return handle to a code object. |
| 381 Handle<Code> GenerateCode(Linkage* linkage); |
| 382 |
| 383 bool ScheduleAndSelectInstructions(Linkage* linkage); |
| 384 void RunPrintAndVerify(const char* phase, bool untyped = false); |
| 385 Handle<Code> ScheduleAndGenerateCode(CallDescriptor* call_descriptor); |
| 386 void AllocateRegisters(const RegisterConfiguration* config, |
| 387 CallDescriptor* descriptor, bool run_verifier); |
| 388 |
| 389 CompilationInfo* info() const; |
| 390 Isolate* isolate() const; |
| 391 |
| 392 PipelineData* const data_; |
| 393 }; |
| 362 | 394 |
| 363 namespace { | 395 namespace { |
| 364 | 396 |
| 365 struct TurboCfgFile : public std::ofstream { | 397 struct TurboCfgFile : public std::ofstream { |
| 366 explicit TurboCfgFile(Isolate* isolate) | 398 explicit TurboCfgFile(Isolate* isolate) |
| 367 : std::ofstream(isolate->GetTurboCfgFileName().c_str(), | 399 : std::ofstream(isolate->GetTurboCfgFileName().c_str(), |
| 368 std::ios_base::app) {} | 400 std::ios_base::app) {} |
| 369 }; | 401 }; |
| 370 | 402 |
| 371 | 403 |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 Status OptimizeGraphImpl() final; | 571 Status OptimizeGraphImpl() final; |
| 540 Status GenerateCodeImpl() final; | 572 Status GenerateCodeImpl() final; |
| 541 | 573 |
| 542 private: | 574 private: |
| 543 Zone zone_; | 575 Zone zone_; |
| 544 ZonePool zone_pool_; | 576 ZonePool zone_pool_; |
| 545 ParseInfo parse_info_; | 577 ParseInfo parse_info_; |
| 546 CompilationInfo info_; | 578 CompilationInfo info_; |
| 547 base::SmartPointer<PipelineStatistics> pipeline_statistics_; | 579 base::SmartPointer<PipelineStatistics> pipeline_statistics_; |
| 548 PipelineData data_; | 580 PipelineData data_; |
| 549 Pipeline pipeline_; | 581 PipelineImpl pipeline_; |
| 550 Linkage* linkage_; | 582 Linkage* linkage_; |
| 551 }; | 583 }; |
| 552 | 584 |
| 553 PipelineCompilationJob::Status PipelineCompilationJob::CreateGraphImpl() { | 585 PipelineCompilationJob::Status PipelineCompilationJob::CreateGraphImpl() { |
| 554 if (info()->shared_info()->asm_function()) { | 586 if (info()->shared_info()->asm_function()) { |
| 555 if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); | 587 if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); |
| 556 info()->MarkAsFunctionContextSpecializing(); | 588 info()->MarkAsFunctionContextSpecializing(); |
| 557 } else { | 589 } else { |
| 558 if (!FLAG_always_opt) { | 590 if (!FLAG_always_opt) { |
| 559 info()->MarkAsBailoutOnUninitialized(); | 591 info()->MarkAsBailoutOnUninitialized(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 linkage_(descriptor) {} | 645 linkage_(descriptor) {} |
| 614 | 646 |
| 615 protected: | 647 protected: |
| 616 Status CreateGraphImpl() final; | 648 Status CreateGraphImpl() final; |
| 617 Status OptimizeGraphImpl() final; | 649 Status OptimizeGraphImpl() final; |
| 618 Status GenerateCodeImpl() final; | 650 Status GenerateCodeImpl() final; |
| 619 | 651 |
| 620 private: | 652 private: |
| 621 ZonePool zone_pool_; | 653 ZonePool zone_pool_; |
| 622 PipelineData data_; | 654 PipelineData data_; |
| 623 Pipeline pipeline_; | 655 PipelineImpl pipeline_; |
| 624 Linkage linkage_; | 656 Linkage linkage_; |
| 625 }; | 657 }; |
| 626 | 658 |
| 627 PipelineWasmCompilationJob::Status | 659 PipelineWasmCompilationJob::Status |
| 628 PipelineWasmCompilationJob::CreateGraphImpl() { | 660 PipelineWasmCompilationJob::CreateGraphImpl() { |
| 629 return SUCCEEDED; | 661 return SUCCEEDED; |
| 630 } | 662 } |
| 631 | 663 |
| 632 PipelineWasmCompilationJob::Status | 664 PipelineWasmCompilationJob::Status |
| 633 PipelineWasmCompilationJob::OptimizeGraphImpl() { | 665 PipelineWasmCompilationJob::OptimizeGraphImpl() { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 646 if (!pipeline_.ScheduleAndSelectInstructions(&linkage_)) return FAILED; | 678 if (!pipeline_.ScheduleAndSelectInstructions(&linkage_)) return FAILED; |
| 647 return SUCCEEDED; | 679 return SUCCEEDED; |
| 648 } | 680 } |
| 649 | 681 |
| 650 PipelineWasmCompilationJob::Status | 682 PipelineWasmCompilationJob::Status |
| 651 PipelineWasmCompilationJob::GenerateCodeImpl() { | 683 PipelineWasmCompilationJob::GenerateCodeImpl() { |
| 652 pipeline_.GenerateCode(&linkage_); | 684 pipeline_.GenerateCode(&linkage_); |
| 653 return SUCCEEDED; | 685 return SUCCEEDED; |
| 654 } | 686 } |
| 655 | 687 |
| 656 | |
| 657 template <typename Phase> | 688 template <typename Phase> |
| 658 void Pipeline::Run() { | 689 void PipelineImpl::Run() { |
| 659 PipelineRunScope scope(this->data_, Phase::phase_name()); | 690 PipelineRunScope scope(this->data_, Phase::phase_name()); |
| 660 Phase phase; | 691 Phase phase; |
| 661 phase.Run(this->data_, scope.zone()); | 692 phase.Run(this->data_, scope.zone()); |
| 662 } | 693 } |
| 663 | 694 |
| 664 | |
| 665 template <typename Phase, typename Arg0> | 695 template <typename Phase, typename Arg0> |
| 666 void Pipeline::Run(Arg0 arg_0) { | 696 void PipelineImpl::Run(Arg0 arg_0) { |
| 667 PipelineRunScope scope(this->data_, Phase::phase_name()); | 697 PipelineRunScope scope(this->data_, Phase::phase_name()); |
| 668 Phase phase; | 698 Phase phase; |
| 669 phase.Run(this->data_, scope.zone(), arg_0); | 699 phase.Run(this->data_, scope.zone(), arg_0); |
| 670 } | 700 } |
| 671 | 701 |
| 672 template <typename Phase, typename Arg0, typename Arg1> | 702 template <typename Phase, typename Arg0, typename Arg1> |
| 673 void Pipeline::Run(Arg0 arg_0, Arg1 arg_1) { | 703 void PipelineImpl::Run(Arg0 arg_0, Arg1 arg_1) { |
| 674 PipelineRunScope scope(this->data_, Phase::phase_name()); | 704 PipelineRunScope scope(this->data_, Phase::phase_name()); |
| 675 Phase phase; | 705 Phase phase; |
| 676 phase.Run(this->data_, scope.zone(), arg_0, arg_1); | 706 phase.Run(this->data_, scope.zone(), arg_0, arg_1); |
| 677 } | 707 } |
| 678 | 708 |
| 679 struct LoopAssignmentAnalysisPhase { | 709 struct LoopAssignmentAnalysisPhase { |
| 680 static const char* phase_name() { return "loop assignment analysis"; } | 710 static const char* phase_name() { return "loop assignment analysis"; } |
| 681 | 711 |
| 682 void Run(PipelineData* data, Zone* temp_zone) { | 712 void Run(PipelineData* data, Zone* temp_zone) { |
| 683 if (!data->info()->is_optimizing_from_bytecode()) { | 713 if (!data->info()->is_optimizing_from_bytecode()) { |
| (...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1288 struct VerifyGraphPhase { | 1318 struct VerifyGraphPhase { |
| 1289 static const char* phase_name() { return nullptr; } | 1319 static const char* phase_name() { return nullptr; } |
| 1290 | 1320 |
| 1291 void Run(PipelineData* data, Zone* temp_zone, const bool untyped, | 1321 void Run(PipelineData* data, Zone* temp_zone, const bool untyped, |
| 1292 bool values_only = false) { | 1322 bool values_only = false) { |
| 1293 Verifier::Run(data->graph(), !untyped ? Verifier::TYPED : Verifier::UNTYPED, | 1323 Verifier::Run(data->graph(), !untyped ? Verifier::TYPED : Verifier::UNTYPED, |
| 1294 values_only ? Verifier::kValuesOnly : Verifier::kAll); | 1324 values_only ? Verifier::kValuesOnly : Verifier::kAll); |
| 1295 } | 1325 } |
| 1296 }; | 1326 }; |
| 1297 | 1327 |
| 1298 | 1328 void PipelineImpl::RunPrintAndVerify(const char* phase, bool untyped) { |
| 1299 void Pipeline::RunPrintAndVerify(const char* phase, bool untyped) { | |
| 1300 if (FLAG_trace_turbo) { | 1329 if (FLAG_trace_turbo) { |
| 1301 Run<PrintGraphPhase>(phase); | 1330 Run<PrintGraphPhase>(phase); |
| 1302 } | 1331 } |
| 1303 if (FLAG_turbo_verify) { | 1332 if (FLAG_turbo_verify) { |
| 1304 Run<VerifyGraphPhase>(untyped); | 1333 Run<VerifyGraphPhase>(untyped); |
| 1305 } | 1334 } |
| 1306 } | 1335 } |
| 1307 | 1336 |
| 1308 bool Pipeline::CreateGraph() { | 1337 bool PipelineImpl::CreateGraph() { |
| 1309 PipelineData* data = this->data_; | 1338 PipelineData* data = this->data_; |
| 1310 | 1339 |
| 1311 data->BeginPhaseKind("graph creation"); | 1340 data->BeginPhaseKind("graph creation"); |
| 1312 | 1341 |
| 1313 if (FLAG_trace_turbo) { | 1342 if (FLAG_trace_turbo) { |
| 1314 OFStream os(stdout); | 1343 OFStream os(stdout); |
| 1315 os << "---------------------------------------------------\n" | 1344 os << "---------------------------------------------------\n" |
| 1316 << "Begin compiling method " << info()->GetDebugName().get() | 1345 << "Begin compiling method " << info()->GetDebugName().get() |
| 1317 << " using Turbofan" << std::endl; | 1346 << " using Turbofan" << std::endl; |
| 1318 TurboCfgFile tcf(isolate()); | 1347 TurboCfgFile tcf(isolate()); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1405 // the types from the nodes at this point (currently only in Debug builds). | 1434 // the types from the nodes at this point (currently only in Debug builds). |
| 1406 Run<UntyperPhase>(); | 1435 Run<UntyperPhase>(); |
| 1407 RunPrintAndVerify("Untyped", true); | 1436 RunPrintAndVerify("Untyped", true); |
| 1408 #endif | 1437 #endif |
| 1409 | 1438 |
| 1410 data->EndPhaseKind(); | 1439 data->EndPhaseKind(); |
| 1411 | 1440 |
| 1412 return true; | 1441 return true; |
| 1413 } | 1442 } |
| 1414 | 1443 |
| 1415 bool Pipeline::OptimizeGraph(Linkage* linkage) { | 1444 bool PipelineImpl::OptimizeGraph(Linkage* linkage) { |
| 1416 PipelineData* data = this->data_; | 1445 PipelineData* data = this->data_; |
| 1417 | 1446 |
| 1418 data->BeginPhaseKind("block building"); | 1447 data->BeginPhaseKind("block building"); |
| 1419 | 1448 |
| 1420 Run<EffectControlLinearizationPhase>(); | 1449 Run<EffectControlLinearizationPhase>(); |
| 1421 RunPrintAndVerify("Effect and control linearized", true); | 1450 RunPrintAndVerify("Effect and control linearized", true); |
| 1422 | 1451 |
| 1423 Run<BranchEliminationPhase>(); | 1452 Run<BranchEliminationPhase>(); |
| 1424 RunPrintAndVerify("Branch conditions eliminated", true); | 1453 RunPrintAndVerify("Branch conditions eliminated", true); |
| 1425 | 1454 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1452 | 1481 |
| 1453 // Construct a pipeline for scheduling and code generation. | 1482 // Construct a pipeline for scheduling and code generation. |
| 1454 ZonePool zone_pool(isolate->allocator()); | 1483 ZonePool zone_pool(isolate->allocator()); |
| 1455 PipelineData data(&zone_pool, &info, graph, schedule); | 1484 PipelineData data(&zone_pool, &info, graph, schedule); |
| 1456 base::SmartPointer<PipelineStatistics> pipeline_statistics; | 1485 base::SmartPointer<PipelineStatistics> pipeline_statistics; |
| 1457 if (FLAG_turbo_stats) { | 1486 if (FLAG_turbo_stats) { |
| 1458 pipeline_statistics.Reset(new PipelineStatistics(&info, &zone_pool)); | 1487 pipeline_statistics.Reset(new PipelineStatistics(&info, &zone_pool)); |
| 1459 pipeline_statistics->BeginPhaseKind("stub codegen"); | 1488 pipeline_statistics->BeginPhaseKind("stub codegen"); |
| 1460 } | 1489 } |
| 1461 | 1490 |
| 1462 Pipeline pipeline(&data); | 1491 PipelineImpl pipeline(&data); |
| 1463 DCHECK_NOT_NULL(data.schedule()); | 1492 DCHECK_NOT_NULL(data.schedule()); |
| 1464 | 1493 |
| 1465 if (FLAG_trace_turbo) { | 1494 if (FLAG_trace_turbo) { |
| 1466 FILE* json_file = OpenVisualizerLogFile(&info, nullptr, "json", "w+"); | 1495 FILE* json_file = OpenVisualizerLogFile(&info, nullptr, "json", "w+"); |
| 1467 if (json_file != nullptr) { | 1496 if (json_file != nullptr) { |
| 1468 OFStream json_of(json_file); | 1497 OFStream json_of(json_file); |
| 1469 json_of << "{\"function\":\"" << info.GetDebugName().get() | 1498 json_of << "{\"function\":\"" << info.GetDebugName().get() |
| 1470 << "\", \"source\":\"\",\n\"phases\":["; | 1499 << "\", \"source\":\"\",\n\"phases\":["; |
| 1471 fclose(json_file); | 1500 fclose(json_file); |
| 1472 } | 1501 } |
| 1473 pipeline.Run<PrintGraphPhase>("Machine"); | 1502 pipeline.Run<PrintGraphPhase>("Machine"); |
| 1474 } | 1503 } |
| 1475 | 1504 |
| 1476 pipeline.Run<VerifyGraphPhase>(false, true); | 1505 pipeline.Run<VerifyGraphPhase>(false, true); |
| 1477 return pipeline.ScheduleAndGenerateCode(call_descriptor); | 1506 return pipeline.ScheduleAndGenerateCode(call_descriptor); |
| 1478 } | 1507 } |
| 1479 | 1508 |
| 1480 // static | 1509 // static |
| 1481 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) { | 1510 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) { |
| 1482 ZonePool zone_pool(info->isolate()->allocator()); | 1511 ZonePool zone_pool(info->isolate()->allocator()); |
| 1483 base::SmartPointer<PipelineStatistics> pipeline_statistics( | 1512 base::SmartPointer<PipelineStatistics> pipeline_statistics( |
| 1484 CreatePipelineStatistics(info, &zone_pool)); | 1513 CreatePipelineStatistics(info, &zone_pool)); |
| 1485 PipelineData data(&zone_pool, info, pipeline_statistics.get()); | 1514 PipelineData data(&zone_pool, info, pipeline_statistics.get()); |
| 1486 Pipeline pipeline(&data); | 1515 PipelineImpl pipeline(&data); |
| 1487 | 1516 |
| 1488 Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info)); | 1517 Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info)); |
| 1489 | 1518 |
| 1490 if (!pipeline.CreateGraph()) return Handle<Code>::null(); | 1519 if (!pipeline.CreateGraph()) return Handle<Code>::null(); |
| 1491 if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null(); | 1520 if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null(); |
| 1492 return pipeline.GenerateCode(&linkage); | 1521 return pipeline.GenerateCode(&linkage); |
| 1493 } | 1522 } |
| 1494 | 1523 |
| 1495 // static | 1524 // static |
| 1496 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, | 1525 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1508 Schedule* schedule) { | 1537 Schedule* schedule) { |
| 1509 // Construct a pipeline for scheduling and code generation. | 1538 // Construct a pipeline for scheduling and code generation. |
| 1510 ZonePool zone_pool(info->isolate()->allocator()); | 1539 ZonePool zone_pool(info->isolate()->allocator()); |
| 1511 PipelineData data(&zone_pool, info, graph, schedule); | 1540 PipelineData data(&zone_pool, info, graph, schedule); |
| 1512 base::SmartPointer<PipelineStatistics> pipeline_statistics; | 1541 base::SmartPointer<PipelineStatistics> pipeline_statistics; |
| 1513 if (FLAG_turbo_stats) { | 1542 if (FLAG_turbo_stats) { |
| 1514 pipeline_statistics.Reset(new PipelineStatistics(info, &zone_pool)); | 1543 pipeline_statistics.Reset(new PipelineStatistics(info, &zone_pool)); |
| 1515 pipeline_statistics->BeginPhaseKind("test codegen"); | 1544 pipeline_statistics->BeginPhaseKind("test codegen"); |
| 1516 } | 1545 } |
| 1517 | 1546 |
| 1518 Pipeline pipeline(&data); | 1547 PipelineImpl pipeline(&data); |
| 1519 | 1548 |
| 1520 if (FLAG_trace_turbo) { | 1549 if (FLAG_trace_turbo) { |
| 1521 FILE* json_file = OpenVisualizerLogFile(info, nullptr, "json", "w+"); | 1550 FILE* json_file = OpenVisualizerLogFile(info, nullptr, "json", "w+"); |
| 1522 if (json_file != nullptr) { | 1551 if (json_file != nullptr) { |
| 1523 OFStream json_of(json_file); | 1552 OFStream json_of(json_file); |
| 1524 json_of << "{\"function\":\"" << info->GetDebugName().get() | 1553 json_of << "{\"function\":\"" << info->GetDebugName().get() |
| 1525 << "\", \"source\":\"\",\n\"phases\":["; | 1554 << "\", \"source\":\"\",\n\"phases\":["; |
| 1526 fclose(json_file); | 1555 fclose(json_file); |
| 1527 } | 1556 } |
| 1528 } | 1557 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1545 source_positions); | 1574 source_positions); |
| 1546 } | 1575 } |
| 1547 | 1576 |
| 1548 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, | 1577 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, |
| 1549 InstructionSequence* sequence, | 1578 InstructionSequence* sequence, |
| 1550 bool run_verifier) { | 1579 bool run_verifier) { |
| 1551 CompilationInfo info(ArrayVector("testing"), sequence->isolate(), | 1580 CompilationInfo info(ArrayVector("testing"), sequence->isolate(), |
| 1552 sequence->zone()); | 1581 sequence->zone()); |
| 1553 ZonePool zone_pool(sequence->isolate()->allocator()); | 1582 ZonePool zone_pool(sequence->isolate()->allocator()); |
| 1554 PipelineData data(&zone_pool, &info, sequence); | 1583 PipelineData data(&zone_pool, &info, sequence); |
| 1555 Pipeline pipeline(&data); | 1584 PipelineImpl pipeline(&data); |
| 1556 pipeline.data_->InitializeFrameData(nullptr); | 1585 pipeline.data_->InitializeFrameData(nullptr); |
| 1557 pipeline.AllocateRegisters(config, nullptr, run_verifier); | 1586 pipeline.AllocateRegisters(config, nullptr, run_verifier); |
| 1558 return !data.compilation_failed(); | 1587 return !data.compilation_failed(); |
| 1559 } | 1588 } |
| 1560 | 1589 |
| 1561 bool Pipeline::ScheduleAndSelectInstructions(Linkage* linkage) { | 1590 bool PipelineImpl::ScheduleAndSelectInstructions(Linkage* linkage) { |
| 1562 CallDescriptor* call_descriptor = linkage->GetIncomingDescriptor(); | 1591 CallDescriptor* call_descriptor = linkage->GetIncomingDescriptor(); |
| 1563 PipelineData* data = this->data_; | 1592 PipelineData* data = this->data_; |
| 1564 | 1593 |
| 1565 DCHECK_NOT_NULL(data->graph()); | 1594 DCHECK_NOT_NULL(data->graph()); |
| 1566 | 1595 |
| 1567 if (data->schedule() == nullptr) Run<ComputeSchedulePhase>(); | 1596 if (data->schedule() == nullptr) Run<ComputeSchedulePhase>(); |
| 1568 TraceSchedule(data->info(), data->schedule()); | 1597 TraceSchedule(data->info(), data->schedule()); |
| 1569 | 1598 |
| 1570 if (FLAG_turbo_profiling) { | 1599 if (FLAG_turbo_profiling) { |
| 1571 data->set_profiler_data(BasicBlockInstrumentor::Instrument( | 1600 data->set_profiler_data(BasicBlockInstrumentor::Instrument( |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1614 // Optimimize jumps. | 1643 // Optimimize jumps. |
| 1615 if (FLAG_turbo_jt) { | 1644 if (FLAG_turbo_jt) { |
| 1616 Run<JumpThreadingPhase>(generate_frame_at_start); | 1645 Run<JumpThreadingPhase>(generate_frame_at_start); |
| 1617 } | 1646 } |
| 1618 | 1647 |
| 1619 data->EndPhaseKind(); | 1648 data->EndPhaseKind(); |
| 1620 | 1649 |
| 1621 return true; | 1650 return true; |
| 1622 } | 1651 } |
| 1623 | 1652 |
| 1624 Handle<Code> Pipeline::GenerateCode(Linkage* linkage) { | 1653 Handle<Code> PipelineImpl::GenerateCode(Linkage* linkage) { |
| 1625 PipelineData* data = this->data_; | 1654 PipelineData* data = this->data_; |
| 1626 | 1655 |
| 1627 data->BeginPhaseKind("code generation"); | 1656 data->BeginPhaseKind("code generation"); |
| 1628 | 1657 |
| 1629 // Generate final machine code. | 1658 // Generate final machine code. |
| 1630 Run<GenerateCodePhase>(linkage); | 1659 Run<GenerateCodePhase>(linkage); |
| 1631 | 1660 |
| 1632 Handle<Code> code = data->code(); | 1661 Handle<Code> code = data->code(); |
| 1633 if (data->profiler_data()) { | 1662 if (data->profiler_data()) { |
| 1634 #if ENABLE_DISASSEMBLER | 1663 #if ENABLE_DISASSEMBLER |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1663 } | 1692 } |
| 1664 OFStream os(stdout); | 1693 OFStream os(stdout); |
| 1665 os << "---------------------------------------------------\n" | 1694 os << "---------------------------------------------------\n" |
| 1666 << "Finished compiling method " << info()->GetDebugName().get() | 1695 << "Finished compiling method " << info()->GetDebugName().get() |
| 1667 << " using Turbofan" << std::endl; | 1696 << " using Turbofan" << std::endl; |
| 1668 } | 1697 } |
| 1669 | 1698 |
| 1670 return code; | 1699 return code; |
| 1671 } | 1700 } |
| 1672 | 1701 |
| 1673 Handle<Code> Pipeline::ScheduleAndGenerateCode( | 1702 Handle<Code> PipelineImpl::ScheduleAndGenerateCode( |
| 1674 CallDescriptor* call_descriptor) { | 1703 CallDescriptor* call_descriptor) { |
| 1675 Linkage linkage(call_descriptor); | 1704 Linkage linkage(call_descriptor); |
| 1676 | 1705 |
| 1677 // Schedule the graph, perform instruction selection and register allocation. | 1706 // Schedule the graph, perform instruction selection and register allocation. |
| 1678 if (!ScheduleAndSelectInstructions(&linkage)) return Handle<Code>(); | 1707 if (!ScheduleAndSelectInstructions(&linkage)) return Handle<Code>(); |
| 1679 | 1708 |
| 1680 // Generate the final machine code. | 1709 // Generate the final machine code. |
| 1681 return GenerateCode(&linkage); | 1710 return GenerateCode(&linkage); |
| 1682 } | 1711 } |
| 1683 | 1712 |
| 1684 void Pipeline::AllocateRegisters(const RegisterConfiguration* config, | 1713 void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config, |
| 1685 CallDescriptor* descriptor, | 1714 CallDescriptor* descriptor, |
| 1686 bool run_verifier) { | 1715 bool run_verifier) { |
| 1687 PipelineData* data = this->data_; | 1716 PipelineData* data = this->data_; |
| 1688 // Don't track usage for this zone in compiler stats. | 1717 // Don't track usage for this zone in compiler stats. |
| 1689 base::SmartPointer<Zone> verifier_zone; | 1718 base::SmartPointer<Zone> verifier_zone; |
| 1690 RegisterAllocatorVerifier* verifier = nullptr; | 1719 RegisterAllocatorVerifier* verifier = nullptr; |
| 1691 if (run_verifier) { | 1720 if (run_verifier) { |
| 1692 verifier_zone.Reset(new Zone(isolate()->allocator())); | 1721 verifier_zone.Reset(new Zone(isolate()->allocator())); |
| 1693 verifier = new (verifier_zone.get()) RegisterAllocatorVerifier( | 1722 verifier = new (verifier_zone.get()) RegisterAllocatorVerifier( |
| 1694 verifier_zone.get(), config, data->sequence()); | 1723 verifier_zone.get(), config, data->sequence()); |
| 1695 } | 1724 } |
| 1696 | 1725 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1763 | 1792 |
| 1764 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { | 1793 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { |
| 1765 TurboCfgFile tcf(data->isolate()); | 1794 TurboCfgFile tcf(data->isolate()); |
| 1766 tcf << AsC1VRegisterAllocationData("CodeGen", | 1795 tcf << AsC1VRegisterAllocationData("CodeGen", |
| 1767 data->register_allocation_data()); | 1796 data->register_allocation_data()); |
| 1768 } | 1797 } |
| 1769 | 1798 |
| 1770 data->DeleteRegisterAllocationZone(); | 1799 data->DeleteRegisterAllocationZone(); |
| 1771 } | 1800 } |
| 1772 | 1801 |
| 1773 CompilationInfo* Pipeline::info() const { return data_->info(); } | 1802 CompilationInfo* PipelineImpl::info() const { return data_->info(); } |
| 1774 | 1803 |
| 1775 Isolate* Pipeline::isolate() const { return info()->isolate(); } | 1804 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } |
| 1776 | 1805 |
| 1777 } // namespace compiler | 1806 } // namespace compiler |
| 1778 } // namespace internal | 1807 } // namespace internal |
| 1779 } // namespace v8 | 1808 } // namespace v8 |
| OLD | NEW |