| 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/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 graph_reducer.AddReducer(&simple_reducer); | 390 graph_reducer.AddReducer(&simple_reducer); |
| 391 graph_reducer.ReduceGraph(); | 391 graph_reducer.ReduceGraph(); |
| 392 | 392 |
| 393 VerifyAndPrintGraph(data.graph(), "Lowered simplified"); | 393 VerifyAndPrintGraph(data.graph(), "Lowered simplified"); |
| 394 } | 394 } |
| 395 { | 395 { |
| 396 // Lower changes that have been inserted before. | 396 // Lower changes that have been inserted before. |
| 397 PhaseScope phase_scope(pipeline_statistics.get(), "change lowering"); | 397 PhaseScope phase_scope(pipeline_statistics.get(), "change lowering"); |
| 398 SourcePositionTable::Scope pos(data.source_positions(), | 398 SourcePositionTable::Scope pos(data.source_positions(), |
| 399 SourcePosition::Unknown()); | 399 SourcePosition::Unknown()); |
| 400 Linkage linkage(info()); | 400 Linkage linkage(data.graph_zone(), info()); |
| 401 ValueNumberingReducer vn_reducer(data.graph_zone()); | 401 ValueNumberingReducer vn_reducer(data.graph_zone()); |
| 402 SimplifiedOperatorReducer simple_reducer(data.jsgraph()); | 402 SimplifiedOperatorReducer simple_reducer(data.jsgraph()); |
| 403 ChangeLowering lowering(data.jsgraph(), &linkage); | 403 ChangeLowering lowering(data.jsgraph(), &linkage); |
| 404 MachineOperatorReducer mach_reducer(data.jsgraph()); | 404 MachineOperatorReducer mach_reducer(data.jsgraph()); |
| 405 GraphReducer graph_reducer(data.graph()); | 405 GraphReducer graph_reducer(data.graph()); |
| 406 // TODO(titzer): Figure out if we should run all reducers at once here. | 406 // TODO(titzer): Figure out if we should run all reducers at once here. |
| 407 graph_reducer.AddReducer(&vn_reducer); | 407 graph_reducer.AddReducer(&vn_reducer); |
| 408 graph_reducer.AddReducer(&simple_reducer); | 408 graph_reducer.AddReducer(&simple_reducer); |
| 409 graph_reducer.AddReducer(&lowering); | 409 graph_reducer.AddReducer(&lowering); |
| 410 graph_reducer.AddReducer(&mach_reducer); | 410 graph_reducer.AddReducer(&mach_reducer); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 } | 445 } |
| 446 | 446 |
| 447 data.source_positions()->RemoveDecorator(); | 447 data.source_positions()->RemoveDecorator(); |
| 448 | 448 |
| 449 // Compute a schedule. | 449 // Compute a schedule. |
| 450 ComputeSchedule(&data); | 450 ComputeSchedule(&data); |
| 451 | 451 |
| 452 Handle<Code> code = Handle<Code>::null(); | 452 Handle<Code> code = Handle<Code>::null(); |
| 453 { | 453 { |
| 454 // Generate optimized code. | 454 // Generate optimized code. |
| 455 Linkage linkage(info()); | 455 Linkage linkage(data.instruction_zone(), info()); |
| 456 code = GenerateCode(&linkage, &data); | 456 code = GenerateCode(&linkage, &data); |
| 457 info()->SetCode(code); | 457 info()->SetCode(code); |
| 458 } | 458 } |
| 459 | 459 |
| 460 // Print optimized code. | 460 // Print optimized code. |
| 461 v8::internal::CodeGenerator::PrintCode(code, info()); | 461 v8::internal::CodeGenerator::PrintCode(code, info()); |
| 462 | 462 |
| 463 if (FLAG_trace_turbo) { | 463 if (FLAG_trace_turbo) { |
| 464 OFStream os(stdout); | 464 OFStream os(stdout); |
| 465 os << "--------------------------------------------------\n" | 465 os << "--------------------------------------------------\n" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 | 545 |
| 546 if (data->pipeline_statistics() != NULL) { | 546 if (data->pipeline_statistics() != NULL) { |
| 547 data->pipeline_statistics()->BeginPhaseKind("register allocation"); | 547 data->pipeline_statistics()->BeginPhaseKind("register allocation"); |
| 548 } | 548 } |
| 549 | 549 |
| 550 // Allocate registers. | 550 // Allocate registers. |
| 551 Frame frame; | 551 Frame frame; |
| 552 { | 552 { |
| 553 int node_count = sequence.VirtualRegisterCount(); | 553 int node_count = sequence.VirtualRegisterCount(); |
| 554 if (node_count > UnallocatedOperand::kMaxVirtualRegisters) { | 554 if (node_count > UnallocatedOperand::kMaxVirtualRegisters) { |
| 555 linkage->info()->AbortOptimization(kNotEnoughVirtualRegistersForValues); | 555 info()->AbortOptimization(kNotEnoughVirtualRegistersForValues); |
| 556 return Handle<Code>::null(); | 556 return Handle<Code>::null(); |
| 557 } | 557 } |
| 558 ZonePool::Scope zone_scope(data->zone_pool()); | 558 ZonePool::Scope zone_scope(data->zone_pool()); |
| 559 RegisterAllocator allocator(zone_scope.zone(), &frame, linkage->info(), | 559 RegisterAllocator allocator(zone_scope.zone(), &frame, info(), &sequence); |
| 560 &sequence); | |
| 561 if (!allocator.Allocate(data->pipeline_statistics())) { | 560 if (!allocator.Allocate(data->pipeline_statistics())) { |
| 562 linkage->info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc); | 561 info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc); |
| 563 return Handle<Code>::null(); | 562 return Handle<Code>::null(); |
| 564 } | 563 } |
| 565 if (FLAG_trace_turbo) { | 564 if (FLAG_trace_turbo) { |
| 566 TurboCfgFile tcf(isolate()); | 565 TurboCfgFile tcf(isolate()); |
| 567 tcf << AsC1VAllocator("CodeGen", &allocator); | 566 tcf << AsC1VAllocator("CodeGen", &allocator); |
| 568 } | 567 } |
| 569 } | 568 } |
| 570 | 569 |
| 571 if (FLAG_trace_turbo) { | 570 if (FLAG_trace_turbo) { |
| 572 OFStream os(stdout); | 571 OFStream os(stdout); |
| 573 os << "----- Instruction sequence after register allocation -----\n" | 572 os << "----- Instruction sequence after register allocation -----\n" |
| 574 << sequence; | 573 << sequence; |
| 575 } | 574 } |
| 576 | 575 |
| 577 if (data->pipeline_statistics() != NULL) { | 576 if (data->pipeline_statistics() != NULL) { |
| 578 data->pipeline_statistics()->BeginPhaseKind("code generation"); | 577 data->pipeline_statistics()->BeginPhaseKind("code generation"); |
| 579 } | 578 } |
| 580 | 579 |
| 581 // Generate native sequence. | 580 // Generate native sequence. |
| 582 Handle<Code> code; | 581 Handle<Code> code; |
| 583 { | 582 { |
| 584 PhaseScope phase_scope(data->pipeline_statistics(), "generate code"); | 583 PhaseScope phase_scope(data->pipeline_statistics(), "generate code"); |
| 585 CodeGenerator generator(&frame, linkage, &sequence); | 584 CodeGenerator generator(&frame, linkage, &sequence, info()); |
| 586 code = generator.GenerateCode(); | 585 code = generator.GenerateCode(); |
| 587 } | 586 } |
| 588 if (profiler_data != NULL) { | 587 if (profiler_data != NULL) { |
| 589 #if ENABLE_DISASSEMBLER | 588 #if ENABLE_DISASSEMBLER |
| 590 std::ostringstream os; | 589 std::ostringstream os; |
| 591 code->Disassemble(NULL, os); | 590 code->Disassemble(NULL, os); |
| 592 profiler_data->SetCode(&os); | 591 profiler_data->SetCode(&os); |
| 593 #endif | 592 #endif |
| 594 } | 593 } |
| 595 return code; | 594 return code; |
| 596 } | 595 } |
| 597 | 596 |
| 598 | 597 |
| 599 void Pipeline::SetUp() { | 598 void Pipeline::SetUp() { |
| 600 InstructionOperand::SetUpCaches(); | 599 InstructionOperand::SetUpCaches(); |
| 601 } | 600 } |
| 602 | 601 |
| 603 | 602 |
| 604 void Pipeline::TearDown() { | 603 void Pipeline::TearDown() { |
| 605 InstructionOperand::TearDownCaches(); | 604 InstructionOperand::TearDownCaches(); |
| 606 } | 605 } |
| 607 | 606 |
| 608 } // namespace compiler | 607 } // namespace compiler |
| 609 } // namespace internal | 608 } // namespace internal |
| 610 } // namespace v8 | 609 } // namespace v8 |
| OLD | NEW |