| Index: src/compiler/scheduler.cc
|
| diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc
|
| index cc3eae1b337fc914107453cd93ce9ce5847a5db5..402995006b410b9f2fc45df9b53f36b00f677acc 100644
|
| --- a/src/compiler/scheduler.cc
|
| +++ b/src/compiler/scheduler.cc
|
| @@ -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;
|
| }
|
| }
|
| }
|
|
|