aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/schedule.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/schedule.cc')
-rw-r--r--deps/v8/src/compiler/schedule.cc80
1 files changed, 32 insertions, 48 deletions
diff --git a/deps/v8/src/compiler/schedule.cc b/deps/v8/src/compiler/schedule.cc
index 01034ffb73..7632d3cc8c 100644
--- a/deps/v8/src/compiler/schedule.cc
+++ b/deps/v8/src/compiler/schedule.cc
@@ -42,48 +42,36 @@ bool BasicBlock::LoopContains(BasicBlock* block) const {
block->rpo_number_ < loop_end_->rpo_number_;
}
-
void BasicBlock::AddSuccessor(BasicBlock* successor) {
successors_.push_back(successor);
}
-
void BasicBlock::AddPredecessor(BasicBlock* predecessor) {
predecessors_.push_back(predecessor);
}
-
void BasicBlock::AddNode(Node* node) { nodes_.push_back(node); }
-
-void BasicBlock::set_control(Control control) {
- control_ = control;
-}
-
+void BasicBlock::set_control(Control control) { control_ = control; }
void BasicBlock::set_control_input(Node* control_input) {
control_input_ = control_input;
}
-
void BasicBlock::set_loop_depth(int32_t loop_depth) {
loop_depth_ = loop_depth;
}
-
void BasicBlock::set_rpo_number(int32_t rpo_number) {
rpo_number_ = rpo_number;
}
-
void BasicBlock::set_loop_end(BasicBlock* loop_end) { loop_end_ = loop_end; }
-
void BasicBlock::set_loop_header(BasicBlock* loop_header) {
loop_header_ = loop_header;
}
-
// static
BasicBlock* BasicBlock::GetCommonDominator(BasicBlock* b1, BasicBlock* b2) {
while (b1 != b2) {
@@ -141,12 +129,10 @@ std::ostream& operator<<(std::ostream& os, const BasicBlock::Control& c) {
UNREACHABLE();
}
-
std::ostream& operator<<(std::ostream& os, const BasicBlock::Id& id) {
return os << id.ToSize();
}
-
Schedule::Schedule(Zone* zone, size_t node_count_hint)
: zone_(zone),
all_blocks_(zone),
@@ -157,7 +143,6 @@ Schedule::Schedule(Zone* zone, size_t node_count_hint)
nodeid_to_block_.reserve(node_count_hint);
}
-
BasicBlock* Schedule::block(Node* node) const {
if (node->id() < static_cast<NodeId>(nodeid_to_block_.size())) {
return nodeid_to_block_[node->id()];
@@ -165,25 +150,21 @@ BasicBlock* Schedule::block(Node* node) const {
return nullptr;
}
-
bool Schedule::IsScheduled(Node* node) {
if (node->id() >= nodeid_to_block_.size()) return false;
return nodeid_to_block_[node->id()] != nullptr;
}
-
BasicBlock* Schedule::GetBlockById(BasicBlock::Id block_id) {
DCHECK(block_id.ToSize() < all_blocks_.size());
return all_blocks_[block_id.ToSize()];
}
-
bool Schedule::SameBasicBlock(Node* a, Node* b) const {
BasicBlock* block = this->block(a);
return block != nullptr && block == this->block(b);
}
-
BasicBlock* Schedule::NewBasicBlock() {
BasicBlock* block = new (zone_)
BasicBlock(zone_, BasicBlock::Id::FromSize(all_blocks_.size()));
@@ -191,7 +172,6 @@ BasicBlock* Schedule::NewBasicBlock() {
return block;
}
-
void Schedule::PlanNode(BasicBlock* block, Node* node) {
if (FLAG_trace_turbo_scheduler) {
StdoutStream{} << "Planning #" << node->id() << ":"
@@ -202,7 +182,6 @@ void Schedule::PlanNode(BasicBlock* block, Node* node) {
SetBlockForNode(block, node);
}
-
void Schedule::AddNode(BasicBlock* block, Node* node) {
if (FLAG_trace_turbo_scheduler) {
StdoutStream{} << "Adding #" << node->id() << ":" << node->op()->mnemonic()
@@ -213,7 +192,6 @@ void Schedule::AddNode(BasicBlock* block, Node* node) {
SetBlockForNode(block, node);
}
-
void Schedule::AddGoto(BasicBlock* block, BasicBlock* succ) {
DCHECK_EQ(BasicBlock::kNone, block->control());
block->set_control(BasicBlock::kGoto);
@@ -249,7 +227,6 @@ void Schedule::AddCall(BasicBlock* block, Node* call, BasicBlock* success_block,
SetControlInput(block, call);
}
-
void Schedule::AddBranch(BasicBlock* block, Node* branch, BasicBlock* tblock,
BasicBlock* fblock) {
DCHECK_EQ(BasicBlock::kNone, block->control());
@@ -260,7 +237,6 @@ void Schedule::AddBranch(BasicBlock* block, Node* branch, BasicBlock* tblock,
SetControlInput(block, branch);
}
-
void Schedule::AddSwitch(BasicBlock* block, Node* sw, BasicBlock** succ_blocks,
size_t succ_count) {
DCHECK_EQ(BasicBlock::kNone, block->control());
@@ -272,7 +248,6 @@ void Schedule::AddSwitch(BasicBlock* block, Node* sw, BasicBlock** succ_blocks,
SetControlInput(block, sw);
}
-
void Schedule::AddTailCall(BasicBlock* block, Node* input) {
DCHECK_EQ(BasicBlock::kNone, block->control());
block->set_control(BasicBlock::kTailCall);
@@ -280,7 +255,6 @@ void Schedule::AddTailCall(BasicBlock* block, Node* input) {
if (block != end()) AddSuccessor(block, end());
}
-
void Schedule::AddReturn(BasicBlock* block, Node* input) {
DCHECK_EQ(BasicBlock::kNone, block->control());
block->set_control(BasicBlock::kReturn);
@@ -288,7 +262,6 @@ void Schedule::AddReturn(BasicBlock* block, Node* input) {
if (block != end()) AddSuccessor(block, end());
}
-
void Schedule::AddDeoptimize(BasicBlock* block, Node* input) {
DCHECK_EQ(BasicBlock::kNone, block->control());
block->set_control(BasicBlock::kDeoptimize);
@@ -296,7 +269,6 @@ void Schedule::AddDeoptimize(BasicBlock* block, Node* input) {
if (block != end()) AddSuccessor(block, end());
}
-
void Schedule::AddThrow(BasicBlock* block, Node* input) {
DCHECK_EQ(BasicBlock::kNone, block->control());
block->set_control(BasicBlock::kThrow);
@@ -304,7 +276,6 @@ void Schedule::AddThrow(BasicBlock* block, Node* input) {
if (block != end()) AddSuccessor(block, end());
}
-
void Schedule::InsertBranch(BasicBlock* block, BasicBlock* end, Node* branch,
BasicBlock* tblock, BasicBlock* fblock) {
DCHECK_NE(BasicBlock::kNone, block->control());
@@ -320,7 +291,6 @@ void Schedule::InsertBranch(BasicBlock* block, BasicBlock* end, Node* branch,
SetControlInput(block, branch);
}
-
void Schedule::InsertSwitch(BasicBlock* block, BasicBlock* end, Node* sw,
BasicBlock** succ_blocks, size_t succ_count) {
DCHECK_NE(BasicBlock::kNone, block->control());
@@ -343,7 +313,7 @@ void Schedule::EnsureCFGWellFormedness() {
BasicBlockVector all_blocks_copy(all_blocks_);
// Insert missing split edge blocks.
- for (auto block : all_blocks_copy) {
+ for (BasicBlock* block : all_blocks_copy) {
if (block->PredecessorCount() > 1) {
if (block != end_) {
EnsureSplitEdgeForm(block);
@@ -351,24 +321,42 @@ void Schedule::EnsureCFGWellFormedness() {
if (block->deferred()) {
EnsureDeferredCodeSingleEntryPoint(block);
}
- } else {
- EliminateNoopPhiNodes(block);
}
}
+
+ EliminateRedundantPhiNodes();
}
-void Schedule::EliminateNoopPhiNodes(BasicBlock* block) {
- // Ensure that useless phi nodes in blocks that only have a single predecessor
+void Schedule::EliminateRedundantPhiNodes() {
+ // Ensure that useless phi nodes that only have a single input, identical
+ // inputs, or are a self-referential loop phi,
// -- which can happen with the automatically generated code in the CSA and
// torque -- are pruned.
- if (block->PredecessorCount() == 1) {
- for (size_t i = 0; i < block->NodeCount();) {
- Node* node = block->NodeAt(i);
- if (node->opcode() == IrOpcode::kPhi) {
- node->ReplaceUses(node->InputAt(0));
- block->RemoveNode(block->begin() + i);
- } else {
- ++i;
+ // Since we have strucured control flow, this is enough to minimize the number
+ // of phi nodes.
+ bool reached_fixed_point = false;
+ while (!reached_fixed_point) {
+ reached_fixed_point = true;
+ for (BasicBlock* block : all_blocks_) {
+ int predecessor_count = static_cast<int>(block->PredecessorCount());
+ for (size_t node_pos = 0; node_pos < block->NodeCount(); ++node_pos) {
+ Node* node = block->NodeAt(node_pos);
+ if (node->opcode() == IrOpcode::kPhi) {
+ Node* first_input = node->InputAt(0);
+ bool inputs_equal = true;
+ for (int i = 1; i < predecessor_count; ++i) {
+ Node* input = node->InputAt(i);
+ if (input != first_input && input != node) {
+ inputs_equal = false;
+ break;
+ }
+ }
+ if (!inputs_equal) continue;
+ node->ReplaceUses(first_input);
+ block->RemoveNode(block->begin() + node_pos);
+ --node_pos;
+ reached_fixed_point = false;
+ }
}
}
}
@@ -481,7 +469,6 @@ void Schedule::AddSuccessor(BasicBlock* block, BasicBlock* succ) {
succ->AddPredecessor(block);
}
-
void Schedule::MoveSuccessors(BasicBlock* from, BasicBlock* to) {
for (BasicBlock* const successor : from->successors()) {
to->AddSuccessor(successor);
@@ -492,13 +479,11 @@ void Schedule::MoveSuccessors(BasicBlock* from, BasicBlock* to) {
from->ClearSuccessors();
}
-
void Schedule::SetControlInput(BasicBlock* block, Node* node) {
block->set_control_input(node);
SetBlockForNode(block, node);
}
-
void Schedule::SetBlockForNode(BasicBlock* block, Node* node) {
if (node->id() >= nodeid_to_block_.size()) {
nodeid_to_block_.resize(node->id() + 1);
@@ -506,7 +491,6 @@ void Schedule::SetBlockForNode(BasicBlock* block, Node* node) {
nodeid_to_block_[node->id()] = block;
}
-
std::ostream& operator<<(std::ostream& os, const Schedule& s) {
for (BasicBlock* block :
((s.RpoBlockCount() == 0) ? *s.all_blocks() : *s.rpo_order())) {