Remove workaround for successors on end block from scheduler.
R=titzer@chromium.org TEST=cctest/test-scheduler/RPOLoop Review URL: https://codereview.chromium.org/708763002 Cr-Commit-Position: refs/heads/master@{#25188} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25188 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
9b72f14ced
commit
f9575cef57
@ -527,7 +527,6 @@ class SpecialRPONumberer : public ZoneObject {
|
||||
schedule_(schedule),
|
||||
order_(NULL),
|
||||
loops_(zone),
|
||||
beyond_end_(NULL),
|
||||
backedges_(1, zone),
|
||||
stack_(zone),
|
||||
previous_block_count_(0) {}
|
||||
@ -535,9 +534,9 @@ class SpecialRPONumberer : public ZoneObject {
|
||||
// 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.
|
||||
void ComputeSpecialRPO() {
|
||||
DCHECK(schedule_->end()->SuccessorCount() == 0);
|
||||
DCHECK_EQ(NULL, order_); // Main order does not exist yet.
|
||||
// TODO(mstarzinger): Should use Schedule::end() after tests are fixed.
|
||||
ComputeAndInsertSpecialRPO(schedule_->start(), NULL);
|
||||
ComputeAndInsertSpecialRPO(schedule_->start(), schedule_->end());
|
||||
}
|
||||
|
||||
// Computes the special reverse-post-order for a partial control flow graph,
|
||||
@ -570,7 +569,9 @@ class SpecialRPONumberer : public ZoneObject {
|
||||
l->block->set_rpo_number(number++);
|
||||
schedule_->rpo_order()->push_back(l->block);
|
||||
}
|
||||
BeyondEndSentinel()->set_rpo_number(number);
|
||||
if (schedule_->end()->rpo_number() < 0) {
|
||||
schedule_->end()->set_rpo_number(number);
|
||||
}
|
||||
}
|
||||
|
||||
// Print and verify the special reverse-post-order.
|
||||
@ -655,17 +656,6 @@ class SpecialRPONumberer : public ZoneObject {
|
||||
return block->ao_number() >= 0;
|
||||
}
|
||||
|
||||
// TODO(mstarzinger): We only need this special sentinel because some tests
|
||||
// use the schedule's end block in actual control flow (e.g. with end having
|
||||
// successors). Once this has been cleaned up we can use the end block here.
|
||||
BasicBlock* BeyondEndSentinel() {
|
||||
if (beyond_end_ == NULL) {
|
||||
BasicBlock::Id id = BasicBlock::Id::FromInt(-1);
|
||||
beyond_end_ = new (schedule_->zone()) BasicBlock(schedule_->zone(), id);
|
||||
}
|
||||
return beyond_end_;
|
||||
}
|
||||
|
||||
// Compute special RPO for the control flow graph between {entry} and {end},
|
||||
// mutating any existing order so that the result is still valid.
|
||||
void ComputeAndInsertSpecialRPO(BasicBlock* entry, BasicBlock* end) {
|
||||
@ -848,7 +838,7 @@ class SpecialRPONumberer : public ZoneObject {
|
||||
++loop_depth;
|
||||
current_loop = &loops_[GetLoopNumber(current)];
|
||||
BlockList* end = current_loop->end;
|
||||
current->set_loop_end(end == NULL ? BeyondEndSentinel() : end->block);
|
||||
current->set_loop_end(end == NULL ? schedule_->end() : end->block);
|
||||
current_header = current_loop->header;
|
||||
Trace("B%d is a loop header, increment loop depth to %d\n",
|
||||
current->id().ToInt(), loop_depth);
|
||||
@ -1018,7 +1008,6 @@ class SpecialRPONumberer : public ZoneObject {
|
||||
Schedule* schedule_;
|
||||
BlockList* order_;
|
||||
ZoneVector<LoopInfo> loops_;
|
||||
BasicBlock* beyond_end_;
|
||||
ZoneList<Backedge> backedges_;
|
||||
ZoneVector<SpecialRPOStackFrame> stack_;
|
||||
size_t previous_block_count_;
|
||||
|
@ -200,12 +200,13 @@ TEST(RPOSelfLoop) {
|
||||
TEST(RPOEntryLoop) {
|
||||
HandleAndZoneScope scope;
|
||||
Schedule schedule(scope.main_zone());
|
||||
schedule.AddSuccessorForTesting(schedule.start(), schedule.end());
|
||||
schedule.AddSuccessorForTesting(schedule.end(), schedule.start());
|
||||
BasicBlock* body = schedule.NewBasicBlock();
|
||||
schedule.AddSuccessorForTesting(schedule.start(), body);
|
||||
schedule.AddSuccessorForTesting(body, schedule.start());
|
||||
ZonePool zone_pool(scope.main_isolate());
|
||||
BasicBlockVector* order = Scheduler::ComputeSpecialRPO(&zone_pool, &schedule);
|
||||
CheckRPONumbers(order, 2, true);
|
||||
BasicBlock* loop[] = {schedule.start(), schedule.end()};
|
||||
BasicBlock* loop[] = {schedule.start(), body};
|
||||
CheckLoop(order, loop, 2);
|
||||
}
|
||||
|
||||
@ -653,7 +654,7 @@ TEST(RPOLoopMultibackedge) {
|
||||
BasicBlock* A = schedule.start();
|
||||
BasicBlock* B = schedule.NewBasicBlock();
|
||||
BasicBlock* C = schedule.NewBasicBlock();
|
||||
BasicBlock* D = schedule.end();
|
||||
BasicBlock* D = schedule.NewBasicBlock();
|
||||
BasicBlock* E = schedule.NewBasicBlock();
|
||||
|
||||
schedule.AddSuccessorForTesting(A, B);
|
||||
|
Loading…
Reference in New Issue
Block a user