Reviewers: jarin,

Description:
Revert "[turbofan] Fix select lowering."

This reverts commit cf08e8d70ff0fa35dd315ddc430b743bb04c89cf for
breaking Embenchen bullet.

[email protected]

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

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

Affected files (+15, -61 lines):
  M src/compiler/node.h
  M src/compiler/select-lowering.h
  M src/compiler/select-lowering.cc
  M test/unittests/compiler/select-lowering-unittest.cc


Index: src/compiler/node.h
diff --git a/src/compiler/node.h b/src/compiler/node.h
index 8a442cedbc7aed407eda1e7f88d6388df58cdba3..3a5afd25dad800d070a901eecce8ca2591b0c7e8 100644
--- a/src/compiler/node.h
+++ b/src/compiler/node.h
@@ -68,8 +68,6 @@ typedef std::set<Node*, std::less<Node*>, zone_allocator<Node*> > NodeSet;
 typedef NodeSet::iterator NodeSetIter;
 typedef NodeSet::reverse_iterator NodeSetRIter;

-typedef ZoneDeque<Node*> NodeDeque;
-
 typedef ZoneVector<Node*> NodeVector;
 typedef NodeVector::iterator NodeVectorIter;
 typedef NodeVector::const_iterator NodeVectorConstIter;
Index: src/compiler/select-lowering.cc
diff --git a/src/compiler/select-lowering.cc b/src/compiler/select-lowering.cc index 44d040df046dbaf504706fa7cfa7b6490fa1d945..2e51d72024bb8f96e3f82850352b132c682209bd 100644
--- a/src/compiler/select-lowering.cc
+++ b/src/compiler/select-lowering.cc
@@ -26,58 +26,26 @@ Reduction SelectLowering::Reduce(Node* node) {
   if (node->opcode() != IrOpcode::kSelect) return NoChange();
   SelectParameters const p = SelectParametersOf(node->op());

-  Node* cond = node->InputAt(0);
-  Node* vthen = node->InputAt(1);
-  Node* velse = node->InputAt(2);
-  Node* merge = nullptr;
+  Node* const cond = node->InputAt(0);

   // Check if we already have a diamond for this condition.
-  auto range = merges_.equal_range(cond);
-  for (auto i = range.first;; ++i) {
-    if (i == range.second) {
- // Create a new diamond for this condition and remember its merge node.
-      Diamond d(graph(), common(), cond, p.hint());
-      merges_.insert(std::make_pair(cond, d.merge));
-      merge = d.merge;
-      break;
-    }
-
- // If the diamond is reachable from the Select, merging them would result in
-    // an unschedulable graph, so we cannot reuse the diamond in that case.
-    merge = i->second;
-    if (!ReachableFrom(merge, node)) {
-      break;
-    }
+  auto i = merges_.find(cond);
+  if (i == merges_.end()) {
+    // Create a new diamond for this condition and remember its merge node.
+    Diamond d(graph(), common(), cond, p.hint());
+    i = merges_.insert(std::make_pair(cond, d.merge)).first;
   }

+  DCHECK_EQ(cond, i->first);
+
   // Create a Phi hanging off the previously determined merge.
   node->set_op(common()->Phi(p.type(), 2));
-  node->ReplaceInput(0, vthen);
-  node->ReplaceInput(1, velse);
-  node->ReplaceInput(2, merge);
+  node->ReplaceInput(0, node->InputAt(1));
+  node->ReplaceInput(1, node->InputAt(2));
+  node->ReplaceInput(2, i->second);
   return Changed(node);
 }

-
-bool SelectLowering::ReachableFrom(Node* const sink, Node* const source) {
- // TODO(turbofan): This is probably horribly expensive, and it should be moved
-  // into node.h or somewhere else?!
-  Zone zone(graph()->zone()->isolate());
-  std::queue<Node*, NodeDeque> pending((NodeDeque(&zone)));
-  BoolVector visited(graph()->NodeCount(), false, &zone);
-  pending.push(source);
-  while (!pending.empty()) {
-    Node* current = pending.front();
-    if (current == sink) return true;
-    pending.pop();
-    visited[current->id()] = true;
-    for (auto input : current->inputs()) {
-      if (!visited[input->id()]) pending.push(input);
-    }
-  }
-  return false;
-}
-
 }  // namespace compiler
 }  // namespace internal
 }  // namespace v8
Index: src/compiler/select-lowering.h
diff --git a/src/compiler/select-lowering.h b/src/compiler/select-lowering.h
index 05ea0e0c75869c8063362cef35276fbb70491daf..ae22cade84420584cd21bb41140b343c51213c33 100644
--- a/src/compiler/select-lowering.h
+++ b/src/compiler/select-lowering.h
@@ -28,10 +28,8 @@ class SelectLowering FINAL : public Reducer {
   Reduction Reduce(Node* node) OVERRIDE;

  private:
-  typedef std::multimap<Node*, Node*, std::less<Node*>,
- zone_allocator<std::pair<Node* const, Node*>>> Merges;
-
-  bool ReachableFrom(Node* const sink, Node* const source);
+  typedef std::map<Node*, Node*, std::less<Node*>,
+                   zone_allocator<std::pair<Node* const, Node*>>> Merges;

   CommonOperatorBuilder* common() const { return common_; }
   Graph* graph() const { return graph_; }
Index: test/unittests/compiler/select-lowering-unittest.cc
diff --git a/test/unittests/compiler/select-lowering-unittest.cc b/test/unittests/compiler/select-lowering-unittest.cc index 51efc83f87c2eb15d4d8f6edfe3ac3a7ef77a34b..6dbd7ad73d99608931c8a6d06c1781b656b38bd3 100644
--- a/test/unittests/compiler/select-lowering-unittest.cc
+++ b/test/unittests/compiler/select-lowering-unittest.cc
@@ -10,7 +10,6 @@
 using testing::AllOf;
 using testing::Capture;
 using testing::CaptureEq;
-using testing::Not;

 namespace v8 {
 namespace internal {
@@ -34,12 +33,12 @@ TEST_F(SelectLoweringTest, SelectWithSameConditions) {
   Node* const p2 = Parameter(2);
   Node* const p3 = Parameter(3);
   Node* const p4 = Parameter(4);
- Node* const s0 = graph()->NewNode(common()->Select(kMachInt32), p0, p1, p2);

   Capture<Node*> branch;
   Capture<Node*> merge;
   {
-    Reduction const r = Reduce(s0);
+    Reduction const r =
+        Reduce(graph()->NewNode(common()->Select(kMachInt32), p0, p1, p2));
     ASSERT_TRUE(r.Changed());
     EXPECT_THAT(
         r.replacement(),
@@ -56,15 +55,6 @@ TEST_F(SelectLoweringTest, SelectWithSameConditions) {
     ASSERT_TRUE(r.Changed());
EXPECT_THAT(r.replacement(), IsPhi(kMachInt32, p3, p4, CaptureEq(&merge)));
   }
-  {
- // We must not reuse the diamond if it is reachable from either else/then - // values of the Select, because the resulting graph can not be scheduled.
-    Reduction const r =
-        Reduce(graph()->NewNode(common()->Select(kMachInt32), p0, s0, p0));
-    ASSERT_TRUE(r.Changed());
-    EXPECT_THAT(r.replacement(),
-                IsPhi(kMachInt32, s0, p0, Not(CaptureEq(&merge))));
-  }
 }

 }  // namespace compiler


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