Reviewers: titzer,
Description:
Start immediate dominator propagation at entry to floating control.
[email protected]
Please review this at https://codereview.chromium.org/761673004/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+19, -13 lines):
M src/compiler/scheduler.h
M src/compiler/scheduler.cc
Index: src/compiler/scheduler.cc
diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc
index
0f3b4c4248dea93856a6c4a2a7b677f8c0abfba7..6f0676fae39a315af87c3e1de77698916d18e402
100644
--- a/src/compiler/scheduler.cc
+++ b/src/compiler/scheduler.cc
@@ -1037,15 +1037,9 @@ void Scheduler::ComputeSpecialRPONumbering() {
}
-void Scheduler::GenerateImmediateDominatorTree() {
- Trace("--- IMMEDIATE BLOCK DOMINATORS -----------------------------\n");
-
- // TODO(danno): Consider using Lengauer & Tarjan's if this becomes too
slow.
-
- // Build the block dominator tree.
- schedule_->start()->set_dominator_depth(0);
- BasicBlock* second = schedule_->start()->rpo_next();
- for (BasicBlock* block = second; block != NULL; block =
block->rpo_next()) {
+// TODO(danno): Consider using Lengauer & Tarjan's if this becomes too
slow.
+void Scheduler::PropagateImmediateDominators(BasicBlock* block) {
+ for (/*nop*/; block != NULL; block = block->rpo_next()) {
BasicBlock::Predecessors::iterator pred = block->predecessors_begin();
BasicBlock::Predecessors::iterator end = block->predecessors_end();
DCHECK(pred != end); // All blocks except start have predecessors.
@@ -1068,6 +1062,17 @@ void Scheduler::GenerateImmediateDominatorTree() {
}
+void Scheduler::GenerateImmediateDominatorTree() {
+ Trace("--- IMMEDIATE BLOCK DOMINATORS -----------------------------\n");
+
+ // Seed start block to be the first dominator.
+ schedule_->start()->set_dominator_depth(0);
+
+ // Build the block dominator tree resulting from the above seed.
+ PropagateImmediateDominators(schedule_->start()->rpo_next());
+}
+
+
//
-----------------------------------------------------------------------------
// Phase 3: Prepare use counts for nodes.
@@ -1434,11 +1439,11 @@ void Scheduler::FuseFloatingControl(BasicBlock*
block, Node* node) {
// Iterate on phase 2: Compute special RPO and dominator tree.
special_rpo_->UpdateSpecialRPO(block, schedule_->block(node));
// TODO(mstarzinger): Currently "iterate on" means "re-run". Fix that.
- for (BasicBlock* block : schedule_->all_blocks_) {
- block->set_dominator_depth(-1);
- block->set_dominator(NULL);
+ for (BasicBlock* b = block->rpo_next(); b != NULL; b = b->rpo_next()) {
+ b->set_dominator_depth(-1);
+ b->set_dominator(NULL);
}
- GenerateImmediateDominatorTree();
+ PropagateImmediateDominators(block->rpo_next());
// Iterate on phase 4: Schedule nodes early.
// TODO(mstarzinger): The following loop gathering the propagation roots
is a
Index: src/compiler/scheduler.h
diff --git a/src/compiler/scheduler.h b/src/compiler/scheduler.h
index
196215956f4b7f42c57c05015483c0ea61223b85..02863817baf3646f506b1f9124a4ab6a133ef8aa
100644
--- a/src/compiler/scheduler.h
+++ b/src/compiler/scheduler.h
@@ -78,6 +78,7 @@ class Scheduler {
void DecrementUnscheduledUseCount(Node* node, int index, Node* from);
BasicBlock* GetCommonDominator(BasicBlock* b1, BasicBlock* b2);
+ void PropagateImmediateDominators(BasicBlock* block);
// Phase 1: Build control-flow graph.
friend class CFGBuilder;
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.