Fix scheduler not to connect final merge block in the graph to its inputs.
authortitzer@chromium.org <titzer@chromium.org>
Tue, 21 Oct 2014 15:12:45 +0000 (15:12 +0000)
committertitzer@chromium.org <titzer@chromium.org>
Tue, 21 Oct 2014 15:12:45 +0000 (15:12 +0000)
R=mstarzinger@chromium.org
BUG=

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

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

src/compiler/scheduler.cc

index 16773c5cba00b290045ea02a5a14d8750c77bbe7..42ee0c4fb44ea8eb4f240877533197136e09b9ca 100644 (file)
@@ -283,6 +283,9 @@ class CFGBuilder {
   }
 
   void ConnectMerge(Node* merge) {
+    // Don't connect the special merge at the end to its predecessors.
+    if (IsFinalMerge(merge)) return;
+
     BasicBlock* block = schedule_->block(merge);
     DCHECK(block != NULL);
     // For all of the merge's control inputs, add a goto at the end to the
@@ -290,10 +293,8 @@ class CFGBuilder {
     for (InputIter j = merge->inputs().begin(); j != merge->inputs().end();
          ++j) {
       BasicBlock* predecessor_block = schedule_->block(*j);
-      if ((*j)->opcode() != IrOpcode::kReturn) {
-        TraceConnect(merge, predecessor_block, block);
-        schedule_->AddGoto(predecessor_block, block);
-      }
+      TraceConnect(merge, predecessor_block, block);
+      schedule_->AddGoto(predecessor_block, block);
     }
   }
 
@@ -314,6 +315,10 @@ class CFGBuilder {
             block->id().ToInt(), succ->id().ToInt());
     }
   }
+
+  bool IsFinalMerge(Node* node) {
+    return (node == scheduler_->graph_->end()->InputAt(0));
+  }
 };