| Index: src/compiler/schedule.cc
|
| diff --git a/src/compiler/schedule.cc b/src/compiler/schedule.cc
|
| index 9c5800f8ed15cd7ed7e08af1d62f72fd35058277..51400cf04c2d12b71a1b6d1a3126e2da5f69458d 100644
|
| --- a/src/compiler/schedule.cc
|
| +++ b/src/compiler/schedule.cc
|
| @@ -13,7 +13,9 @@ namespace internal {
|
| namespace compiler {
|
|
|
| BasicBlock::BasicBlock(Zone* zone, Id id)
|
| - : rpo_number_(-1),
|
| + : ao_number_(-1),
|
| + rpo_number_(-1),
|
| + deferred_(false),
|
| dominator_(NULL),
|
| loop_header_(NULL),
|
| loop_depth_(0),
|
| @@ -35,12 +37,6 @@ bool BasicBlock::LoopContains(BasicBlock* block) const {
|
| }
|
|
|
|
|
| -BasicBlock* BasicBlock::ContainingLoop() {
|
| - if (IsLoopHeader()) return this;
|
| - return loop_header();
|
| -}
|
| -
|
| -
|
| void BasicBlock::AddSuccessor(BasicBlock* successor) {
|
| successors_.push_back(successor);
|
| }
|
| @@ -55,7 +51,6 @@ void BasicBlock::AddNode(Node* node) { nodes_.push_back(node); }
|
|
|
|
|
| void BasicBlock::set_control(Control control) {
|
| - DCHECK(control_ == BasicBlock::kNone);
|
| control_ = control;
|
| }
|
|
|
| @@ -88,16 +83,6 @@ void BasicBlock::set_loop_header(BasicBlock* loop_header) {
|
| }
|
|
|
|
|
| -size_t BasicBlock::PredecessorIndexOf(BasicBlock* predecessor) {
|
| - size_t j = 0;
|
| - for (BasicBlock::Predecessors::iterator i = predecessors_.begin();
|
| - i != predecessors_.end(); ++i, ++j) {
|
| - if (*i == predecessor) break;
|
| - }
|
| - return j;
|
| -}
|
| -
|
| -
|
| std::ostream& operator<<(std::ostream& os, const BasicBlock::Control& c) {
|
| switch (c) {
|
| case BasicBlock::kNone:
|
| @@ -121,6 +106,11 @@ std::ostream& operator<<(std::ostream& os, const BasicBlock::Id& id) {
|
| }
|
|
|
|
|
| +std::ostream& operator<<(std::ostream& os, const BasicBlock::RpoNumber& rpo) {
|
| + return os << rpo.ToSize();
|
| +}
|
| +
|
| +
|
| Schedule::Schedule(Zone* zone, size_t node_count_hint)
|
| : zone_(zone),
|
| all_blocks_(zone),
|
| @@ -205,10 +195,6 @@ void Schedule::AddBranch(BasicBlock* block, Node* branch, BasicBlock* tblock,
|
| AddSuccessor(block, tblock);
|
| AddSuccessor(block, fblock);
|
| SetControlInput(block, branch);
|
| - if (branch->opcode() == IrOpcode::kBranch) {
|
| - // TODO(titzer): require a Branch node here. (sloppy tests).
|
| - SetBlockForNode(block, branch);
|
| - }
|
| }
|
|
|
|
|
| @@ -216,13 +202,7 @@ void Schedule::AddReturn(BasicBlock* block, Node* input) {
|
| DCHECK(block->control() == BasicBlock::kNone);
|
| block->set_control(BasicBlock::kReturn);
|
| SetControlInput(block, input);
|
| - if (block != end()) {
|
| - AddSuccessor(block, end());
|
| - }
|
| - if (input->opcode() == IrOpcode::kReturn) {
|
| - // TODO(titzer): require a Return node here. (sloppy tests).
|
| - SetBlockForNode(block, input);
|
| - }
|
| + if (block != end()) AddSuccessor(block, end());
|
| }
|
|
|
|
|
| @@ -234,12 +214,42 @@ void Schedule::AddThrow(BasicBlock* block, Node* input) {
|
| }
|
|
|
|
|
| +void Schedule::InsertBranch(BasicBlock* block, BasicBlock* end, Node* branch,
|
| + BasicBlock* tblock, BasicBlock* fblock) {
|
| + DCHECK(block->control() != BasicBlock::kNone);
|
| + DCHECK(end->control() == BasicBlock::kNone);
|
| + end->set_control(block->control());
|
| + block->set_control(BasicBlock::kBranch);
|
| + MoveSuccessors(block, end);
|
| + AddSuccessor(block, tblock);
|
| + AddSuccessor(block, fblock);
|
| + if (block->control_input() != NULL) {
|
| + SetControlInput(end, block->control_input());
|
| + }
|
| + SetControlInput(block, branch);
|
| +}
|
| +
|
| +
|
| void Schedule::AddSuccessor(BasicBlock* block, BasicBlock* succ) {
|
| block->AddSuccessor(succ);
|
| succ->AddPredecessor(block);
|
| }
|
|
|
|
|
| +void Schedule::MoveSuccessors(BasicBlock* from, BasicBlock* to) {
|
| + for (BasicBlock::Predecessors::iterator i = from->successors_begin();
|
| + i != from->successors_end(); ++i) {
|
| + BasicBlock* succ = *i;
|
| + to->AddSuccessor(succ);
|
| + for (BasicBlock::Predecessors::iterator j = succ->predecessors_begin();
|
| + j != succ->predecessors_end(); ++j) {
|
| + if (*j == from) *j = to;
|
| + }
|
| + }
|
| + from->ClearSuccessors();
|
| +}
|
| +
|
| +
|
| void Schedule::SetControlInput(BasicBlock* block, Node* node) {
|
| block->set_control_input(node);
|
| SetBlockForNode(block, node);
|
| @@ -261,6 +271,7 @@ std::ostream& operator<<(std::ostream& os, const Schedule& s) {
|
| for (BasicBlockVectorIter i = rpo->begin(); i != rpo->end(); ++i) {
|
| BasicBlock* block = *i;
|
| os << "--- BLOCK B" << block->id();
|
| + if (block->deferred()) os << " (deferred)";
|
| if (block->PredecessorCount() != 0) os << " <- ";
|
| bool comma = false;
|
| for (BasicBlock::Predecessors::iterator j = block->predecessors_begin();
|
|
|