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.

Reply via email to