Reviewers: jarin,

Message:
PTAL

Description:
[turbofan] Propagate "deferredness" to dominated basic blocks.

TEST=cctest/test-scheduler

Please review this at https://codereview.chromium.org/686273005/

Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+30, -14 lines):
  M src/compiler/scheduler.cc
  M test/cctest/compiler/test-scheduler.cc


Index: src/compiler/scheduler.cc
diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc
index 1599152f95f47dfa557882b735e0d0357044a0c0..72b0c61dfca06ab401fc5116b4e8048558c10a51 100644
--- a/src/compiler/scheduler.cc
+++ b/src/compiler/scheduler.cc
@@ -422,8 +422,6 @@ class CFGBuilder {
                            IrOpcode::kIfFalse);

     // Consider branch hints.
- // TODO(turbofan): Propagate the deferred flag to all blocks dominated by
-    // this IfTrue/IfFalse later.
     switch (BranchHintOf(branch->op())) {
       case BranchHint::kNone:
         break;
@@ -534,6 +532,18 @@ class SpecialRPONumberer {
   SpecialRPONumberer(Zone* zone, Schedule* schedule)
       : zone_(zone), schedule_(schedule) {}

+  void ComputeAssemblyOrder() {
+    // Compute the assembly order (non-deferred code first, deferred code
+    // afterwards).
+    int32_t number = 0;
+    for (auto const block : *schedule_->rpo_order()) {
+      if (!block->deferred()) block->set_ao_number(number++);
+    }
+    for (auto const block : *schedule_->rpo_order()) {
+      if (block->deferred()) block->set_ao_number(number++);
+    }
+  }
+
   void ComputeSpecialRPO() {
     // RPO should not have been computed for this schedule yet.
     CHECK_EQ(kBlockUnvisited1, schedule_->start()->rpo_number());
@@ -723,18 +733,6 @@ class SpecialRPONumberer {
       }
     }

-    // Compute the assembly order (non-deferred code first, deferred code
-    // afterwards).
-    int32_t number = 0;
-    for (auto block : *final_order) {
-      if (block->deferred()) continue;
-      block->set_ao_number(number++);
-    }
-    for (auto block : *final_order) {
-      if (!block->deferred()) continue;
-      block->set_ao_number(number++);
-    }
-
 #if DEBUG
if (FLAG_trace_turbo_scheduler) PrintRPO(num_loops, loops, final_order);
     VerifySpecialRPO(num_loops, loops, final_order);
@@ -768,6 +766,7 @@ class SpecialRPONumberer {
     void Serialize(BasicBlockVector* final_order) {
       for (BlockList* l = this; l != NULL; l = l->next) {
         l->block->set_rpo_number(static_cast<int>(final_order->size()));
+        l->block->set_ao_number(static_cast<int>(final_order->size()));
         final_order->push_back(l->block);
       }
     }
@@ -958,6 +957,7 @@ BasicBlockVector* Scheduler::ComputeSpecialRPO(ZonePool* zone_pool,

   SpecialRPONumberer numberer(zone, schedule);
   numberer.ComputeSpecialRPO();
+  numberer.ComputeAssemblyOrder();
   return schedule->rpo_order();
 }

@@ -998,6 +998,8 @@ void Scheduler::GenerateImmediateDominatorTree() {
       current_rpo->set_dominator(dominator);
       Trace("Block %d's idom is %d\n", current_rpo->id().ToInt(),
             dominator->id().ToInt());
+      // Propagate "deferredness" of the dominator.
+      if (dominator->deferred()) current_rpo->set_deferred(true);
     }
   }
 }
@@ -1344,6 +1346,7 @@ void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) {
   BasicBlockVector* rpo = schedule_->rpo_order();
   for (BasicBlockVectorIter i = rpo->begin(); i != rpo->end(); ++i) {
     BasicBlock* block = *i;
+    block->set_ao_number(-1);
     block->set_rpo_number(-1);
     block->set_loop_header(NULL);
     block->set_loop_depth(0);
@@ -1353,6 +1356,7 @@ void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) {
   SpecialRPONumberer numberer(zone_, schedule_);
   numberer.ComputeSpecialRPO();
   GenerateImmediateDominatorTree();
+  numberer.ComputeAssemblyOrder();
   scheduled_nodes_.resize(schedule_->BasicBlockCount(), NodeVector(zone_));

   // Move previously planned nodes.
Index: test/cctest/compiler/test-scheduler.cc
diff --git a/test/cctest/compiler/test-scheduler.cc b/test/cctest/compiler/test-scheduler.cc index 0ade4d15ed1a6aa31083009d42676865ba280616..22741d6fcf3f271ea03dcdddfae9b7979d35144e 100644
--- a/test/cctest/compiler/test-scheduler.cc
+++ b/test/cctest/compiler/test-scheduler.cc
@@ -34,6 +34,17 @@ static void CheckRPONumbers(BasicBlockVector* order, size_t expected,
       CHECK_EQ(NULL, order->at(i)->loop_header());
     }
   }
+  int number = 0;
+  for (auto const block : *order) {
+    if (block->deferred()) continue;
+    CHECK_EQ(number, block->ao_number());
+    ++number;
+  }
+  for (auto const block : *order) {
+    if (!block->deferred()) continue;
+    CHECK_EQ(number, block->ao_number());
+    ++number;
+  }
 }


@@ -153,6 +164,7 @@ TEST(RPOLine) {
     BasicBlock* last = schedule.start();
     for (int j = 0; j < i; j++) {
       BasicBlock* block = schedule.NewBasicBlock();
+      block->set_deferred(i & 1);
       schedule.AddGoto(last, block);
       last = block;
     }


--
--
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