OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/scheduler.h" | 5 #include "src/compiler/scheduler.h" |
6 | 6 |
7 #include <iomanip> | 7 #include <iomanip> |
8 | 8 |
9 #include "src/bit-vector.h" | 9 #include "src/bit-vector.h" |
10 #include "src/compiler/common-operator.h" | 10 #include "src/compiler/common-operator.h" |
11 #include "src/compiler/control-equivalence.h" | 11 #include "src/compiler/control-equivalence.h" |
12 #include "src/compiler/graph.h" | 12 #include "src/compiler/graph.h" |
13 #include "src/compiler/node.h" | 13 #include "src/compiler/node.h" |
14 #include "src/compiler/node-marker.h" | 14 #include "src/compiler/node-marker.h" |
15 #include "src/compiler/node-properties.h" | 15 #include "src/compiler/node-properties.h" |
| 16 #include "src/compiler/visualizer.h" |
16 #include "src/zone-containers.h" | 17 #include "src/zone-containers.h" |
17 | 18 |
18 namespace v8 { | 19 namespace v8 { |
19 namespace internal { | 20 namespace internal { |
20 namespace compiler { | 21 namespace compiler { |
21 | 22 |
22 static inline void Trace(const char* msg, ...) { | 23 static inline void Trace(const char* msg, ...) { |
23 if (FLAG_trace_turbo_scheduler) { | 24 if (FLAG_trace_turbo_scheduler) { |
24 va_list arguments; | 25 va_list arguments; |
25 va_start(arguments, msg); | 26 va_start(arguments, msg); |
(...skipping 1604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 } | 1631 } |
1631 | 1632 |
1632 | 1633 |
1633 // ----------------------------------------------------------------------------- | 1634 // ----------------------------------------------------------------------------- |
1634 | 1635 |
1635 | 1636 |
1636 void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) { | 1637 void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) { |
1637 Trace("--- FUSE FLOATING CONTROL ----------------------------------\n"); | 1638 Trace("--- FUSE FLOATING CONTROL ----------------------------------\n"); |
1638 if (FLAG_trace_turbo_scheduler) { | 1639 if (FLAG_trace_turbo_scheduler) { |
1639 OFStream os(stdout); | 1640 OFStream os(stdout); |
1640 os << "Schedule before control flow fusion:\n" << *schedule_; | 1641 os << "Schedule before control flow fusion:\n" |
| 1642 << ScheduleAsJSON(*schedule_); |
1641 } | 1643 } |
1642 | 1644 |
1643 // Iterate on phase 1: Build control-flow graph. | 1645 // Iterate on phase 1: Build control-flow graph. |
1644 control_flow_builder_->Run(block, node); | 1646 control_flow_builder_->Run(block, node); |
1645 | 1647 |
1646 // Iterate on phase 2: Compute special RPO and dominator tree. | 1648 // Iterate on phase 2: Compute special RPO and dominator tree. |
1647 special_rpo_->UpdateSpecialRPO(block, schedule_->block(node)); | 1649 special_rpo_->UpdateSpecialRPO(block, schedule_->block(node)); |
1648 // TODO(mstarzinger): Currently "iterate on" means "re-run". Fix that. | 1650 // TODO(mstarzinger): Currently "iterate on" means "re-run". Fix that. |
1649 for (BasicBlock* b = block->rpo_next(); b != NULL; b = b->rpo_next()) { | 1651 for (BasicBlock* b = block->rpo_next(); b != NULL; b = b->rpo_next()) { |
1650 b->set_dominator_depth(-1); | 1652 b->set_dominator_depth(-1); |
(...skipping 21 matching lines...) Expand all Loading... |
1672 ScheduleEarlyNodeVisitor schedule_early_visitor(zone_, this); | 1674 ScheduleEarlyNodeVisitor schedule_early_visitor(zone_, this); |
1673 schedule_early_visitor.Run(&propagation_roots); | 1675 schedule_early_visitor.Run(&propagation_roots); |
1674 | 1676 |
1675 // Move previously planned nodes. | 1677 // Move previously planned nodes. |
1676 // TODO(mstarzinger): Improve that by supporting bulk moves. | 1678 // TODO(mstarzinger): Improve that by supporting bulk moves. |
1677 scheduled_nodes_.resize(schedule_->BasicBlockCount(), NodeVector(zone_)); | 1679 scheduled_nodes_.resize(schedule_->BasicBlockCount(), NodeVector(zone_)); |
1678 MovePlannedNodes(block, schedule_->block(node)); | 1680 MovePlannedNodes(block, schedule_->block(node)); |
1679 | 1681 |
1680 if (FLAG_trace_turbo_scheduler) { | 1682 if (FLAG_trace_turbo_scheduler) { |
1681 OFStream os(stdout); | 1683 OFStream os(stdout); |
1682 os << "Schedule after control flow fusion:\n" << *schedule_; | 1684 os << "Schedule after control flow fusion:\n" << ScheduleAsJSON(*schedule_); |
1683 } | 1685 } |
1684 } | 1686 } |
1685 | 1687 |
1686 | 1688 |
1687 void Scheduler::MovePlannedNodes(BasicBlock* from, BasicBlock* to) { | 1689 void Scheduler::MovePlannedNodes(BasicBlock* from, BasicBlock* to) { |
1688 Trace("Move planned nodes from id:%d to id:%d\n", from->id().ToInt(), | 1690 Trace("Move planned nodes from id:%d to id:%d\n", from->id().ToInt(), |
1689 to->id().ToInt()); | 1691 to->id().ToInt()); |
1690 NodeVector* nodes = &(scheduled_nodes_[from->id().ToSize()]); | 1692 NodeVector* nodes = &(scheduled_nodes_[from->id().ToSize()]); |
1691 for (Node* const node : *nodes) { | 1693 for (Node* const node : *nodes) { |
1692 schedule_->SetBlockForNode(to, node); | 1694 schedule_->SetBlockForNode(to, node); |
1693 scheduled_nodes_[to->id().ToSize()].push_back(node); | 1695 scheduled_nodes_[to->id().ToSize()].push_back(node); |
1694 } | 1696 } |
1695 nodes->clear(); | 1697 nodes->clear(); |
1696 } | 1698 } |
1697 | 1699 |
1698 } // namespace compiler | 1700 } // namespace compiler |
1699 } // namespace internal | 1701 } // namespace internal |
1700 } // namespace v8 | 1702 } // namespace v8 |
OLD | NEW |