Fix schedule for interleaved floating control by wiring one floating control structur...
authortitzer@chromium.org <titzer@chromium.org>
Mon, 15 Sep 2014 13:57:56 +0000 (13:57 +0000)
committertitzer@chromium.org <titzer@chromium.org>
Mon, 15 Sep 2014 13:57:56 +0000 (13:57 +0000)
R=mstarzinger@chromium.org, bmeurer@chromium.org
BUG=

Review URL: https://codereview.chromium.org/564403003

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23949 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/compiler/scheduler.cc

index cc3eae1..4029950 100644 (file)
@@ -638,13 +638,19 @@ bool Scheduler::ConnectFloatingControl() {
   int max = static_cast<int>(schedule_->rpo_order()->size());
   for (int i = max - 1; i >= 0; i--) {
     BasicBlock* block = schedule_->rpo_order()->at(i);
+    // TODO(titzer): we place at most one floating control structure per
+    // basic block because scheduling currently can interleave phis from
+    // one subgraph with the merges from another subgraph.
+    bool one_placed = false;
     for (int j = static_cast<int>(block->nodes_.size()) - 1; j >= 0; j--) {
       Node* node = block->nodes_[j];
       SchedulerData* data = GetData(node);
-      if (data->is_floating_control_ && !data->is_connected_control_) {
+      if (data->is_floating_control_ && !data->is_connected_control_ &&
+          !one_placed) {
         Trace("  Floating control #%d:%s was scheduled in B%d\n", node->id(),
               node->op()->mnemonic(), block->id());
         ConnectFloatingControlSubgraph(block, node);
+        one_placed = true;
       }
     }
   }