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

Unified Diff: src/compiler/scheduler.cc

Issue 649203002: Switch schedule early phase to basic blocks. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months 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 | « src/compiler/scheduler.h ('k') | 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 6a84591fc1b548ae865bbe58ea176854df315724..37c99ba525e3076171901530e30f1fba405c532d 100644
--- a/src/compiler/scheduler.cc
+++ b/src/compiler/scheduler.cc
@@ -63,7 +63,7 @@ Schedule* Scheduler::ComputeSchedule(Graph* graph) {
Scheduler::SchedulerData Scheduler::DefaultSchedulerData() {
- SchedulerData def = {0, -1, false, false, kUnknown};
+ SchedulerData def = {NULL, 0, false, false, kUnknown};
return def;
}
@@ -315,7 +315,7 @@ class CFGBuilder {
void Scheduler::BuildCFG() {
- Trace("---------------- CREATING CFG ------------------\n");
+ Trace("--- CREATING CFG -------------------------------------------\n");
CFGBuilder cfg_builder(zone_, this);
cfg_builder.Run();
// Initialize per-block data.
@@ -326,7 +326,7 @@ void Scheduler::BuildCFG() {
void Scheduler::GenerateImmediateDominatorTree() {
// Build the dominator graph. TODO(danno): consider using Lengauer & Tarjan's
// if this becomes really slow.
- Trace("------------ IMMEDIATE BLOCK DOMINATORS -----------\n");
+ Trace("--- IMMEDIATE BLOCK DOMINATORS -----------------------------\n");
for (size_t i = 0; i < schedule_->rpo_order_.size(); i++) {
BasicBlock* current_rpo = schedule_->rpo_order_[i];
if (current_rpo != schedule_->start()) {
@@ -405,7 +405,7 @@ class PrepareUsesVisitor : public NullNodeVisitor {
void Scheduler::PrepareUses() {
- Trace("------------------- PREPARE USES ------------------\n");
+ Trace("--- PREPARE USES -------------------------------------------\n");
// Count the uses of every node, it will be used to ensure that all of a
// node's uses are scheduled before the node itself.
@@ -424,59 +424,55 @@ class ScheduleEarlyNodeVisitor : public NullNodeVisitor {
: scheduler_(scheduler), schedule_(scheduler->schedule_) {}
GenericGraphVisit::Control Pre(Node* node) {
+ Scheduler::SchedulerData* data = scheduler_->GetData(node);
if (scheduler_->GetPlacement(node) == Scheduler::kFixed) {
// Fixed nodes already know their schedule early position.
- Scheduler::SchedulerData* data = scheduler_->GetData(node);
- BasicBlock* block = schedule_->block(node);
- DCHECK(block != NULL);
- if (data->minimum_rpo_ < 0) {
- data->minimum_rpo_ = block->rpo_number();
+ if (data->minimum_block_ == NULL) {
+ data->minimum_block_ = schedule_->block(node);
Trace("Preschedule #%d:%s minimum_rpo = %d (fixed)\n", node->id(),
- node->op()->mnemonic(), data->minimum_rpo_);
+ node->op()->mnemonic(), data->minimum_block_->rpo_number());
}
} else {
// For unfixed nodes the minimum RPO is the max of all of the inputs.
- Scheduler::SchedulerData* data = scheduler_->GetData(node);
- if (data->minimum_rpo_ < 0) {
- data->minimum_rpo_ = ComputeMaximumInputRPO(node);
- if (data->minimum_rpo_ < 0) return GenericGraphVisit::REENTER;
+ if (data->minimum_block_ == NULL) {
+ data->minimum_block_ = ComputeMaximumInputRPO(node);
+ if (data->minimum_block_ == NULL) return GenericGraphVisit::REENTER;
Trace("Preschedule #%d:%s minimum_rpo = %d\n", node->id(),
- node->op()->mnemonic(), data->minimum_rpo_);
+ node->op()->mnemonic(), data->minimum_block_->rpo_number());
}
- DCHECK_GE(data->minimum_rpo_, 0);
}
+ DCHECK_NE(data->minimum_block_, NULL);
return GenericGraphVisit::CONTINUE;
}
GenericGraphVisit::Control Post(Node* node) {
+ Scheduler::SchedulerData* data = scheduler_->GetData(node);
if (scheduler_->GetPlacement(node) != Scheduler::kFixed) {
- Scheduler::SchedulerData* data = scheduler_->GetData(node);
// For unfixed nodes the minimum RPO is the max of all of the inputs.
- if (data->minimum_rpo_ < 0) {
- data->minimum_rpo_ = ComputeMaximumInputRPO(node);
+ if (data->minimum_block_ == NULL) {
+ data->minimum_block_ = ComputeMaximumInputRPO(node);
Trace("Postschedule #%d:%s minimum_rpo = %d\n", node->id(),
- node->op()->mnemonic(), data->minimum_rpo_);
+ node->op()->mnemonic(), data->minimum_block_->rpo_number());
}
- DCHECK_GE(data->minimum_rpo_, 0);
}
+ DCHECK_NE(data->minimum_block_, NULL);
return GenericGraphVisit::CONTINUE;
}
// Computes the maximum of the minimum RPOs for all inputs. If the maximum
- // cannot be determined (i.e. minimum RPO for at least one input not known),
- // then a negative number is returned.
- int ComputeMaximumInputRPO(Node* node) {
- int max_rpo = 0;
+ // cannot be determined (i.e. minimum RPO for at least one input is {NULL}),
+ // then {NULL} is returned.
+ BasicBlock* ComputeMaximumInputRPO(Node* node) {
+ BasicBlock* max_block = schedule_->start();
for (InputIter i = node->inputs().begin(); i != node->inputs().end(); ++i) {
DCHECK_NE(node, *i); // Loops only exist for fixed nodes.
- int control_rpo = scheduler_->GetData(*i)->minimum_rpo_;
- if (control_rpo > max_rpo) {
- max_rpo = control_rpo;
- } else if (control_rpo < 0) {
- return control_rpo;
+ BasicBlock* block = scheduler_->GetData(*i)->minimum_block_;
+ if (block == NULL) return NULL;
+ if (block->rpo_number() > max_block->rpo_number()) {
+ max_block = block;
}
}
- return max_rpo;
+ return max_block;
}
private:
@@ -486,7 +482,7 @@ class ScheduleEarlyNodeVisitor : public NullNodeVisitor {
void Scheduler::ScheduleEarly() {
- Trace("------------------- SCHEDULE EARLY ----------------\n");
+ Trace("--- SCHEDULE EARLY -----------------------------------------\n");
// Compute the minimum RPO for each node thereby determining the earliest
// position each node could be placed within a valid schedule.
@@ -532,7 +528,7 @@ class ScheduleLateNodeVisitor : public NullNodeVisitor {
}
DCHECK(block != NULL);
- int min_rpo = data->minimum_rpo_;
+ int min_rpo = data->minimum_block_->rpo_number();
Trace(
"Schedule late conservative for #%d:%s is B%d at loop depth %d, "
"minimum_rpo = %d\n",
@@ -619,7 +615,7 @@ class ScheduleLateNodeVisitor : public NullNodeVisitor {
void Scheduler::ScheduleLate() {
- Trace("------------------- SCHEDULE LATE -----------------\n");
+ Trace("--- SCHEDULE LATE ------------------------------------------\n");
if (FLAG_trace_turbo_scheduler) {
Trace("roots: ");
for (NodeVectorIter i = schedule_root_nodes_.begin();
@@ -965,7 +961,7 @@ static void VerifySpecialRPO(int num_loops, LoopInfo* loops,
BasicBlockVector* Scheduler::ComputeSpecialRPO(Schedule* schedule) {
Zone tmp_zone(schedule->zone()->isolate());
Zone* zone = &tmp_zone;
- Trace("------------- COMPUTING SPECIAL RPO ---------------\n");
+ Trace("--- COMPUTING SPECIAL RPO ----------------------------------\n");
// RPO should not have been computed for this schedule yet.
CHECK_EQ(kBlockUnvisited1, schedule->start()->rpo_number());
CHECK_EQ(0, static_cast<int>(schedule->rpo_order_.size()));
« no previous file with comments | « src/compiler/scheduler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698