Index: src/compiler/scheduler.cc |
diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc |
index be2c4d9e134a7b717953cb8177cccf51014d664b..8038ce650851fbbf1f759996ac373815a0bd2203 100644 |
--- a/src/compiler/scheduler.cc |
+++ b/src/compiler/scheduler.cc |
@@ -15,22 +15,6 @@ namespace v8 { |
namespace internal { |
namespace compiler { |
-Scheduler::Scheduler(Zone* zone) |
- : zone_(zone), |
- graph_(NULL), |
- schedule_(NULL), |
- branches_(NodeVector::allocator_type(zone)), |
- calls_(NodeVector::allocator_type(zone)), |
- deopts_(NodeVector::allocator_type(zone)), |
- returns_(NodeVector::allocator_type(zone)), |
- loops_and_merges_(NodeVector::allocator_type(zone)), |
- node_block_placement_(BasicBlockVector::allocator_type(zone)), |
- unscheduled_uses_(IntVector::allocator_type(zone)), |
- scheduled_nodes_(NodeVectorVector::allocator_type(zone)), |
- schedule_root_nodes_(NodeVector::allocator_type(zone)), |
- schedule_early_rpo_index_(IntVector::allocator_type(zone)) {} |
- |
- |
Scheduler::Scheduler(Zone* zone, Graph* graph, Schedule* schedule) |
: zone_(zone), |
graph_(graph), |
@@ -47,30 +31,26 @@ Scheduler::Scheduler(Zone* zone, Graph* graph, Schedule* schedule) |
schedule_early_rpo_index_(IntVector::allocator_type(zone)) {} |
-Schedule* Scheduler::NewSchedule(Graph* graph) { |
- graph_ = graph; |
- schedule_ = new (zone_) Schedule(zone_); |
- |
- schedule_->AddNode(schedule_->end(), graph_->end()); |
- |
- PrepareAuxiliaryNodeData(); |
- |
- // Create basic blocks for each block and merge node in the graph. |
- CreateBlocks(); |
+Schedule* Scheduler::ComputeSchedule(Graph* graph) { |
+ Zone tmp_zone(graph->zone()->isolate()); |
+ Schedule* schedule = new (graph->zone()) Schedule(graph->zone()); |
+ Scheduler scheduler(&tmp_zone, graph, schedule); |
- // Wire the basic blocks together. |
- WireBlocks(); |
+ schedule->AddNode(schedule->end(), graph->end()); |
- PrepareAuxiliaryBlockData(); |
+ scheduler.PrepareAuxiliaryNodeData(); |
+ scheduler.CreateBlocks(); |
+ scheduler.WireBlocks(); |
+ scheduler.PrepareAuxiliaryBlockData(); |
- ComputeSpecialRPO(); |
- GenerateImmediateDominatorTree(); |
+ Scheduler::ComputeSpecialRPO(schedule); |
+ scheduler.GenerateImmediateDominatorTree(); |
- PrepareUses(); |
- ScheduleEarly(); |
- ScheduleLate(); |
+ scheduler.PrepareUses(); |
+ scheduler.ScheduleEarly(); |
+ scheduler.ScheduleLate(); |
- return schedule_; |
+ return schedule; |
} |
@@ -866,20 +846,22 @@ static void VerifySpecialRPO(int num_loops, LoopInfo* loops, |
// 2. All loops are contiguous in the order (i.e. no intervening blocks that |
// do not belong to the loop.) |
// Note a simple RPO traversal satisfies (1) but not (3). |
-BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
+BasicBlockVector* Scheduler::ComputeSpecialRPO(Schedule* schedule) { |
+ Zone tmp_zone(schedule->zone()->isolate()); |
+ Zone* zone = &tmp_zone; |
if (FLAG_trace_turbo_scheduler) { |
PrintF("------------- COMPUTING SPECIAL RPO ---------------\n"); |
} |
// RPO should not have been computed for this schedule yet. |
- CHECK_EQ(kBlockUnvisited1, schedule_->entry()->rpo_number_); |
- CHECK_EQ(0, static_cast<int>(schedule_->rpo_order_.size())); |
+ CHECK_EQ(kBlockUnvisited1, schedule->entry()->rpo_number_); |
+ CHECK_EQ(0, static_cast<int>(schedule->rpo_order_.size())); |
// Perform an iterative RPO traversal using an explicit stack, |
// recording backedges that form cycles. O(|B|). |
- ZoneList<std::pair<BasicBlock*, int> > backedges(1, zone_); |
+ ZoneList<std::pair<BasicBlock*, int> > backedges(1, zone); |
SpecialRPOStackFrame* stack = |
- zone_->NewArray<SpecialRPOStackFrame>(schedule_->BasicBlockCount()); |
- BasicBlock* entry = schedule_->entry(); |
+ zone->NewArray<SpecialRPOStackFrame>(schedule->BasicBlockCount()); |
+ BasicBlock* entry = schedule->entry(); |
BlockList* order = NULL; |
int stack_depth = Push(stack, 0, entry, kBlockUnvisited1); |
int num_loops = 0; |
@@ -895,7 +877,7 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
if (succ->rpo_number_ == kBlockOnStack) { |
// The successor is on the stack, so this is a backedge (cycle). |
backedges.Add( |
- std::pair<BasicBlock*, int>(frame->block, frame->index - 1), zone_); |
+ std::pair<BasicBlock*, int>(frame->block, frame->index - 1), zone); |
if (succ->loop_end_ < 0) { |
// Assign a new loop number to the header if it doesn't have one. |
succ->loop_end_ = num_loops++; |
@@ -907,7 +889,7 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
} |
} else { |
// Finished with all successors; pop the stack and add the block. |
- order = order->Add(zone_, frame->block); |
+ order = order->Add(zone, frame->block); |
frame->block->rpo_number_ = kBlockVisited1; |
stack_depth--; |
} |
@@ -918,8 +900,8 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
if (num_loops != 0) { |
// Otherwise, compute the loop information from the backedges in order |
// to perform a traversal that groups loop bodies together. |
- loops = ComputeLoopInfo(zone_, stack, num_loops, |
- schedule_->BasicBlockCount(), &backedges); |
+ loops = ComputeLoopInfo(zone, stack, num_loops, schedule->BasicBlockCount(), |
+ &backedges); |
// Initialize the "loop stack". Note the entry could be a loop header. |
LoopInfo* loop = entry->IsLoopHeader() ? &loops[entry->loop_end_] : NULL; |
@@ -944,7 +926,7 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
// Finish the loop body the first time the header is left on the |
// stack. |
DCHECK(loop != NULL && loop->header == block); |
- loop->start = order->Add(zone_, block); |
+ loop->start = order->Add(zone, block); |
order = loop->end; |
block->rpo_number_ = kBlockVisited2; |
// Pop the loop stack and continue visiting outgoing edges within the |
@@ -973,7 +955,7 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
if (loop != NULL && !loop->members->Contains(succ->id())) { |
// The successor is not in the current loop or any nested loop. |
// Add it to the outgoing edges of this loop and visit it later. |
- loop->AddOutgoing(zone_, succ); |
+ loop->AddOutgoing(zone, succ); |
} else { |
// Push the successor onto the stack. |
stack_depth = Push(stack, stack_depth, succ, kBlockUnvisited2); |
@@ -1001,7 +983,7 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
order = info->start; |
} else { |
// Pop a single node off the stack and add it to the order. |
- order = order->Add(zone_, block); |
+ order = order->Add(zone, block); |
block->rpo_number_ = kBlockVisited2; |
} |
stack_depth--; |
@@ -1010,7 +992,7 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO() { |
} |
// Construct the final order from the list. |
- BasicBlockVector* final_order = &schedule_->rpo_order_; |
+ BasicBlockVector* final_order = &schedule->rpo_order_; |
order->Serialize(final_order); |
// Compute the correct loop header for every block and set the correct loop |