Make floating merges respected minimum RPO of coupled phis.
authormstarzinger@chromium.org <mstarzinger@chromium.org>
Tue, 28 Oct 2014 11:38:22 +0000 (11:38 +0000)
committermstarzinger@chromium.org <mstarzinger@chromium.org>
Tue, 28 Oct 2014 11:38:48 +0000 (11:38 +0000)
R=bmeurer@chromium.org, jarin@chromium.org
TEST=cctest/test-scheduler/LoopedFloatingDiamond

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

Cr-Commit-Position: refs/heads/master@{#24930}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24930 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/compiler/scheduler.cc
test/cctest/compiler/test-scheduler.cc

index 1ee1e2d..d1da320 100644 (file)
@@ -1002,6 +1002,12 @@ class ScheduleEarlyNodeVisitor {
     // No need to propagate to fixed node, it's guaranteed to be a root.
     if (scheduler_->GetPlacement(node) == Scheduler::kFixed) return;
 
+    // Coupled nodes influence schedule early position of their control.
+    if (scheduler_->GetPlacement(node) == Scheduler::kCoupled) {
+      Node* control = NodeProperties::GetControlInput(node);
+      PropagateMinimumRPOToNode(block, control);
+    }
+
     // Propagate new position if it is larger than the current.
     if (block->rpo_number() > data->minimum_block_->rpo_number()) {
       data->minimum_block_ = block;
index e866876..f6019f7 100644 (file)
@@ -1802,6 +1802,45 @@ TEST(NestedFloatingDiamonds) {
 }
 
 
+TEST(LoopedFloatingDiamond) {
+  HandleAndZoneScope scope;
+  Graph graph(scope.main_zone());
+  CommonOperatorBuilder common(scope.main_zone());
+  SimplifiedOperatorBuilder simplified(scope.main_zone());
+  MachineOperatorBuilder machine;
+
+  Node* start = graph.NewNode(common.Start(2));
+  graph.SetStart(start);
+
+  Node* p0 = graph.NewNode(common.Parameter(0), start);
+
+  Node* c = graph.NewNode(common.Int32Constant(7));
+  Node* loop = graph.NewNode(common.Loop(2), start, start);
+  Node* ind = graph.NewNode(common.Phi(kMachAnyTagged, 2), p0, p0, loop);
+  Node* add = graph.NewNode(machine.IntAdd(), ind, c);
+
+  Node* br = graph.NewNode(common.Branch(), add, loop);
+  Node* t = graph.NewNode(common.IfTrue(), br);
+  Node* f = graph.NewNode(common.IfFalse(), br);
+
+  Node* br1 = graph.NewNode(common.Branch(), p0, graph.start());
+  Node* t1 = graph.NewNode(common.IfTrue(), br1);
+  Node* f1 = graph.NewNode(common.IfFalse(), br1);
+  Node* m1 = graph.NewNode(common.Merge(2), t1, f1);
+  Node* phi1 = graph.NewNode(common.Phi(kMachAnyTagged, 2), add, p0, m1);
+
+  loop->ReplaceInput(1, t);    // close loop.
+  ind->ReplaceInput(1, phi1);  // close induction variable.
+
+  Node* ret = graph.NewNode(common.Return(), ind, start, f);
+  Node* end = graph.NewNode(common.End(), ret, f);
+
+  graph.SetEnd(end);
+
+  ComputeAndVerifySchedule(20, &graph);
+}
+
+
 TEST(PhisPushedDownToDifferentBranches) {
   HandleAndZoneScope scope;
   Graph graph(scope.main_zone());