diff options
Diffstat (limited to 'deps/v8/src/compiler/schedule.cc')
-rw-r--r-- | deps/v8/src/compiler/schedule.cc | 79 |
1 files changed, 75 insertions, 4 deletions
diff --git a/deps/v8/src/compiler/schedule.cc b/deps/v8/src/compiler/schedule.cc index 455fcd120e..4ac65e5ae4 100644 --- a/deps/v8/src/compiler/schedule.cc +++ b/deps/v8/src/compiler/schedule.cc @@ -298,6 +298,64 @@ void Schedule::InsertSwitch(BasicBlock* block, BasicBlock* end, Node* sw, SetControlInput(block, sw); } +void Schedule::EnsureSplitEdgeForm() { + // Make a copy of all the blocks for the iteration, since adding the split + // edges will allocate new blocks. + BasicBlockVector all_blocks_copy(all_blocks_); + + // Insert missing split edge blocks. + for (auto block : all_blocks_copy) { + if (block->PredecessorCount() > 1 && block != end_) { + for (auto current_pred = block->predecessors().begin(); + current_pred != block->predecessors().end(); ++current_pred) { + BasicBlock* pred = *current_pred; + if (pred->SuccessorCount() > 1) { + // Found a predecessor block with multiple successors. + BasicBlock* split_edge_block = NewBasicBlock(); + split_edge_block->set_control(BasicBlock::kGoto); + split_edge_block->successors().push_back(block); + split_edge_block->predecessors().push_back(pred); + split_edge_block->set_deferred(pred->deferred()); + *current_pred = split_edge_block; + // Find a corresponding successor in the previous block, replace it + // with the split edge block... but only do it once, since we only + // replace the previous blocks in the current block one at a time. + for (auto successor = pred->successors().begin(); + successor != pred->successors().end(); ++successor) { + if (*successor == block) { + *successor = split_edge_block; + break; + } + } + } + } + } + } +} + +void Schedule::PropagateDeferredMark() { + // Push forward the deferred block marks through newly inserted blocks and + // other improperly marked blocks until a fixed point is reached. + // TODO(danno): optimize the propagation + bool done = false; + while (!done) { + done = true; + for (auto block : all_blocks_) { + if (!block->deferred()) { + bool deferred = block->PredecessorCount() > 0; + for (auto pred : block->predecessors()) { + if (!pred->deferred()) { + deferred = false; + } + } + if (deferred) { + block->set_deferred(true); + done = false; + } + } + } + } +} void Schedule::AddSuccessor(BasicBlock* block, BasicBlock* succ) { block->AddSuccessor(succ); @@ -331,15 +389,24 @@ void Schedule::SetBlockForNode(BasicBlock* block, Node* node) { std::ostream& operator<<(std::ostream& os, const Schedule& s) { - for (BasicBlock* block : *s.rpo_order()) { - os << "--- BLOCK B" << block->rpo_number(); + for (BasicBlock* block : + ((s.RpoBlockCount() == 0) ? *s.all_blocks() : *s.rpo_order())) { + if (block->rpo_number() == -1) { + os << "--- BLOCK id:" << block->id().ToInt(); + } else { + os << "--- BLOCK B" << block->rpo_number(); + } if (block->deferred()) os << " (deferred)"; if (block->PredecessorCount() != 0) os << " <- "; bool comma = false; for (BasicBlock const* predecessor : block->predecessors()) { if (comma) os << ", "; comma = true; - os << "B" << predecessor->rpo_number(); + if (predecessor->rpo_number() == -1) { + os << "id:" << predecessor->id().ToInt(); + } else { + os << "B" << predecessor->rpo_number(); + } } os << " ---\n"; for (Node* node : *block) { @@ -364,7 +431,11 @@ std::ostream& operator<<(std::ostream& os, const Schedule& s) { for (BasicBlock const* successor : block->successors()) { if (comma) os << ", "; comma = true; - os << "B" << successor->rpo_number(); + if (successor->rpo_number() == -1) { + os << "id:" << successor->id().ToInt(); + } else { + os << "B" << successor->rpo_number(); + } } os << "\n"; } |