| 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()));
|
|
|