Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Unified Diff: src/compiler/scheduler.cc

Issue 695303003: Reuse RPO traversal stack in the scheduler. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/scheduler.cc
diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc
index 985d97dcfa1f1a1bf7122145df1c1cd7e5cbebb7..36ed08823d5d6fa9ae9a7082b4fc0f900441a225 100644
--- a/src/compiler/scheduler.cc
+++ b/src/compiler/scheduler.cc
@@ -527,7 +527,10 @@ class SpecialRPONumberer : public ZoneObject {
schedule_(schedule),
order_(NULL),
loops_(zone),
- beyond_end_(NULL) {}
+ beyond_end_(NULL),
+ backedges_(1, zone),
+ stack_(zone),
+ previous_block_count_(0) {}
// Computes the special reverse-post-order for the main control flow graph,
// that is for the graph spanned between the schedule's start and end blocks.
@@ -579,6 +582,8 @@ class SpecialRPONumberer : public ZoneObject {
}
private:
+ typedef std::pair<BasicBlock*, size_t> Backedge;
+
// TODO(mstarzinger): Only for Scheduler::GenerateImmediateDominatorTree.
friend class Scheduler;
@@ -629,8 +634,8 @@ class SpecialRPONumberer : public ZoneObject {
}
};
- int Push(SpecialRPOStackFrame* stack, int depth, BasicBlock* child,
- int unvisited) {
+ int Push(ZoneVector<SpecialRPOStackFrame>& stack, int depth,
+ BasicBlock* child, int unvisited) {
if (child->rpo_number() == unvisited) {
stack[depth].block = child;
stack[depth].index = 0;
@@ -676,15 +681,15 @@ class SpecialRPONumberer : public ZoneObject {
// Perform an iterative RPO traversal using an explicit stack,
// recording backedges that form cycles. O(|B|).
- ZoneList<std::pair<BasicBlock*, size_t> > backedges(1, zone_);
- SpecialRPOStackFrame* stack = zone_->NewArray<SpecialRPOStackFrame>(
- static_cast<int>(schedule_->BasicBlockCount()));
- int stack_depth = Push(stack, 0, entry, kBlockUnvisited1);
+ DCHECK_LT(previous_block_count_, schedule_->BasicBlockCount());
+ stack_.resize(schedule_->BasicBlockCount() - previous_block_count_);
+ previous_block_count_ = schedule_->BasicBlockCount();
+ int stack_depth = Push(stack_, 0, entry, kBlockUnvisited1);
int num_loops = 0;
while (stack_depth > 0) {
int current = stack_depth - 1;
- SpecialRPOStackFrame* frame = stack + current;
+ SpecialRPOStackFrame* frame = &stack_[current];
if (frame->block != end &&
frame->index < frame->block->SuccessorCount()) {
@@ -693,9 +698,7 @@ class SpecialRPONumberer : public ZoneObject {
if (succ->rpo_number() == kBlockVisited1) continue;
if (succ->rpo_number() == kBlockOnStack) {
// The successor is on the stack, so this is a backedge (cycle).
- backedges.Add(
- std::pair<BasicBlock*, size_t>(frame->block, frame->index - 1),
- zone_);
+ backedges_.Add(Backedge(frame->block, frame->index - 1), zone_);
if (!HasLoopNumber(succ)) {
// Assign a new loop number to the header if it doesn't have one.
SetLoopNumber(succ, num_loops++);
@@ -703,7 +706,7 @@ class SpecialRPONumberer : public ZoneObject {
} else {
// Push the successor onto the stack.
DCHECK(succ->rpo_number() == kBlockUnvisited1);
- stack_depth = Push(stack, stack_depth, succ, kBlockUnvisited1);
+ stack_depth = Push(stack_, stack_depth, succ, kBlockUnvisited1);
}
} else {
// Finished with all successors; pop the stack and add the block.
@@ -717,7 +720,7 @@ class SpecialRPONumberer : public ZoneObject {
if (num_loops != 0) {
// Otherwise, compute the loop information from the backedges in order
// to perform a traversal that groups loop bodies together.
- ComputeLoopInfo(stack, num_loops, &backedges);
+ ComputeLoopInfo(stack_, num_loops, &backedges_);
// Initialize the "loop stack". Note the entry could be a loop header.
LoopInfo* loop =
@@ -728,9 +731,9 @@ class SpecialRPONumberer : public ZoneObject {
// edges that lead out of loops. Visits each block once, but linking loop
// sections together is linear in the loop size, so overall is
// O(|B| + max(loop_depth) * max(|loop|))
- stack_depth = Push(stack, 0, entry, kBlockUnvisited2);
+ stack_depth = Push(stack_, 0, entry, kBlockUnvisited2);
while (stack_depth > 0) {
- SpecialRPOStackFrame* frame = stack + (stack_depth - 1);
+ SpecialRPOStackFrame* frame = &stack_[stack_depth - 1];
BasicBlock* block = frame->block;
BasicBlock* succ = NULL;
@@ -776,7 +779,7 @@ class SpecialRPONumberer : public ZoneObject {
loop->AddOutgoing(zone_, succ);
} else {
// Push the successor onto the stack.
- stack_depth = Push(stack, stack_depth, succ, kBlockUnvisited2);
+ stack_depth = Push(stack_, stack_depth, succ, kBlockUnvisited2);
if (HasLoopNumber(succ)) {
// Push the inner loop onto the loop stack.
DCHECK(GetLoopNumber(succ) < num_loops);
@@ -864,8 +867,8 @@ class SpecialRPONumberer : public ZoneObject {
}
// Computes loop membership from the backedges of the control flow graph.
- void ComputeLoopInfo(SpecialRPOStackFrame* queue, size_t num_loops,
- ZoneList<std::pair<BasicBlock*, size_t> >* backedges) {
+ void ComputeLoopInfo(ZoneVector<SpecialRPOStackFrame>& queue,
+ size_t num_loops, ZoneList<Backedge>* backedges) {
loops_.resize(num_loops, LoopInfo());
// Compute loop membership starting from backedges.
@@ -1016,6 +1019,9 @@ class SpecialRPONumberer : public ZoneObject {
BlockList* order_;
ZoneVector<LoopInfo> loops_;
BasicBlock* beyond_end_;
+ ZoneList<Backedge> backedges_;
+ ZoneVector<SpecialRPOStackFrame> stack_;
+ size_t previous_block_count_;
};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698