| 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 <deque> | 5 #include <deque> |
| 6 #include <queue> | 6 #include <queue> |
| 7 | 7 |
| 8 #include "src/compiler/scheduler.h" | 8 #include "src/compiler/scheduler.h" |
| 9 | 9 |
| 10 #include "src/bit-vector.h" | 10 #include "src/bit-vector.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 scheduler.ScheduleEarly(); | 52 scheduler.ScheduleEarly(); |
| 53 scheduler.ScheduleLate(); | 53 scheduler.ScheduleLate(); |
| 54 | 54 |
| 55 scheduler.SealFinalSchedule(); | 55 scheduler.SealFinalSchedule(); |
| 56 | 56 |
| 57 return schedule; | 57 return schedule; |
| 58 } | 58 } |
| 59 | 59 |
| 60 | 60 |
| 61 Scheduler::SchedulerData Scheduler::DefaultSchedulerData() { | 61 Scheduler::SchedulerData Scheduler::DefaultSchedulerData() { |
| 62 SchedulerData def = {schedule_->start(), 0, false, kUnknown}; | 62 SchedulerData def = {schedule_->start(), 0, kUnknown}; |
| 63 return def; | 63 return def; |
| 64 } | 64 } |
| 65 | 65 |
| 66 | 66 |
| 67 Scheduler::SchedulerData* Scheduler::GetData(Node* node) { | 67 Scheduler::SchedulerData* Scheduler::GetData(Node* node) { |
| 68 DCHECK(node->id() < static_cast<int>(node_data_.size())); | 68 DCHECK(node->id() < static_cast<int>(node_data_.size())); |
| 69 return &node_data_[node->id()]; | 69 return &node_data_[node->id()]; |
| 70 } | 70 } |
| 71 | 71 |
| 72 | 72 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 | 228 |
| 229 // Internal class to build a control flow graph (i.e the basic blocks and edges | 229 // Internal class to build a control flow graph (i.e the basic blocks and edges |
| 230 // between them within a Schedule) from the node graph. Visits control edges of | 230 // between them within a Schedule) from the node graph. Visits control edges of |
| 231 // the graph backwards from an end node in order to find the connected control | 231 // the graph backwards from an end node in order to find the connected control |
| 232 // subgraph, needed for scheduling. | 232 // subgraph, needed for scheduling. |
| 233 class CFGBuilder : public ZoneObject { | 233 class CFGBuilder : public ZoneObject { |
| 234 public: | 234 public: |
| 235 CFGBuilder(Zone* zone, Scheduler* scheduler) | 235 CFGBuilder(Zone* zone, Scheduler* scheduler) |
| 236 : scheduler_(scheduler), | 236 : scheduler_(scheduler), |
| 237 schedule_(scheduler->schedule_), | 237 schedule_(scheduler->schedule_), |
| 238 queued_(scheduler->graph_, 2), |
| 238 queue_(zone), | 239 queue_(zone), |
| 239 control_(zone), | 240 control_(zone), |
| 240 component_entry_(NULL), | 241 component_entry_(NULL), |
| 241 component_start_(NULL), | 242 component_start_(NULL), |
| 242 component_end_(NULL) {} | 243 component_end_(NULL) {} |
| 243 | 244 |
| 244 // Run the control flow graph construction algorithm by walking the graph | 245 // Run the control flow graph construction algorithm by walking the graph |
| 245 // backwards from end through control edges, building and connecting the | 246 // backwards from end through control edges, building and connecting the |
| 246 // basic blocks for control nodes. | 247 // basic blocks for control nodes. |
| 247 void Run() { | 248 void Run() { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 // TODO(mstarzinger): Only for Scheduler::FuseFloatingControl. | 303 // TODO(mstarzinger): Only for Scheduler::FuseFloatingControl. |
| 303 friend class Scheduler; | 304 friend class Scheduler; |
| 304 | 305 |
| 305 void FixNode(BasicBlock* block, Node* node) { | 306 void FixNode(BasicBlock* block, Node* node) { |
| 306 schedule_->AddNode(block, node); | 307 schedule_->AddNode(block, node); |
| 307 scheduler_->UpdatePlacement(node, Scheduler::kFixed); | 308 scheduler_->UpdatePlacement(node, Scheduler::kFixed); |
| 308 } | 309 } |
| 309 | 310 |
| 310 void Queue(Node* node) { | 311 void Queue(Node* node) { |
| 311 // Mark the connected control nodes as they are queued. | 312 // Mark the connected control nodes as they are queued. |
| 312 Scheduler::SchedulerData* data = scheduler_->GetData(node); | 313 if (!queued_.Get(node)) { |
| 313 if (!data->is_connected_control_) { | |
| 314 data->is_connected_control_ = true; | |
| 315 BuildBlocks(node); | 314 BuildBlocks(node); |
| 316 queue_.push(node); | 315 queue_.push(node); |
| 316 queued_.Set(node, true); |
| 317 control_.push_back(node); | 317 control_.push_back(node); |
| 318 } | 318 } |
| 319 } | 319 } |
| 320 | 320 |
| 321 void BuildBlocks(Node* node) { | 321 void BuildBlocks(Node* node) { |
| 322 switch (node->opcode()) { | 322 switch (node->opcode()) { |
| 323 case IrOpcode::kEnd: | 323 case IrOpcode::kEnd: |
| 324 FixNode(schedule_->end(), node); | 324 FixNode(schedule_->end(), node); |
| 325 break; | 325 break; |
| 326 case IrOpcode::kStart: | 326 case IrOpcode::kStart: |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 } | 493 } |
| 494 | 494 |
| 495 void ResetDataStructures() { | 495 void ResetDataStructures() { |
| 496 control_.clear(); | 496 control_.clear(); |
| 497 DCHECK(queue_.empty()); | 497 DCHECK(queue_.empty()); |
| 498 DCHECK(control_.empty()); | 498 DCHECK(control_.empty()); |
| 499 } | 499 } |
| 500 | 500 |
| 501 Scheduler* scheduler_; | 501 Scheduler* scheduler_; |
| 502 Schedule* schedule_; | 502 Schedule* schedule_; |
| 503 ZoneQueue<Node*> queue_; | 503 NodeMarker<bool> queued_; // Mark indicating whether node is queued. |
| 504 NodeVector control_; | 504 ZoneQueue<Node*> queue_; // Queue used for breadth-first traversal. |
| 505 Node* component_entry_; | 505 NodeVector control_; // List of encountered control nodes. |
| 506 BasicBlock* component_start_; | 506 Node* component_entry_; // Component single-entry node. |
| 507 BasicBlock* component_end_; | 507 BasicBlock* component_start_; // Component single-entry block. |
| 508 BasicBlock* component_end_; // Component single-exit block. |
| 508 }; | 509 }; |
| 509 | 510 |
| 510 | 511 |
| 511 void Scheduler::BuildCFG() { | 512 void Scheduler::BuildCFG() { |
| 512 Trace("--- CREATING CFG -------------------------------------------\n"); | 513 Trace("--- CREATING CFG -------------------------------------------\n"); |
| 513 | 514 |
| 514 // Instantiate a new control equivalence algorithm for the graph. | 515 // Instantiate a new control equivalence algorithm for the graph. |
| 515 equivalence_ = new (zone_) ControlEquivalence(zone_, graph_); | 516 equivalence_ = new (zone_) ControlEquivalence(zone_, graph_); |
| 516 | 517 |
| 517 // Build a control-flow graph for the main control-connected component that | 518 // Build a control-flow graph for the main control-connected component that |
| (...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1491 for (NodeVectorIter i = nodes->begin(); i != nodes->end(); ++i) { | 1492 for (NodeVectorIter i = nodes->begin(); i != nodes->end(); ++i) { |
| 1492 schedule_->SetBlockForNode(to, *i); | 1493 schedule_->SetBlockForNode(to, *i); |
| 1493 scheduled_nodes_[to->id().ToSize()].push_back(*i); | 1494 scheduled_nodes_[to->id().ToSize()].push_back(*i); |
| 1494 } | 1495 } |
| 1495 nodes->clear(); | 1496 nodes->clear(); |
| 1496 } | 1497 } |
| 1497 | 1498 |
| 1498 } // namespace compiler | 1499 } // namespace compiler |
| 1499 } // namespace internal | 1500 } // namespace internal |
| 1500 } // namespace v8 | 1501 } // namespace v8 |
| OLD | NEW |