[turbofan] GraphReducer is more "fixpointish" now.
authorbmeurer@chromium.org <bmeurer@chromium.org>
Fri, 26 Sep 2014 06:40:07 +0000 (06:40 +0000)
committerbmeurer@chromium.org <bmeurer@chromium.org>
Fri, 26 Sep 2014 06:40:07 +0000 (06:40 +0000)
R=jarin@chromium.org

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

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

src/compiler/graph-reducer-unittest.cc
src/compiler/graph-reducer.cc

index 6567203..2729d58 100644 (file)
@@ -97,15 +97,16 @@ TEST_F(GraphReducerTest, ReduceOnceForEveryReducer) {
 
 
 TEST_F(GraphReducerTest, ReduceAgainAfterChanged) {
-  Sequence s1, s2;
+  Sequence s1, s2, s3;
   StrictMock<MockReducer> r1, r2, r3;
   Node* node0 = graph()->NewNode(&OP0);
   EXPECT_CALL(r1, Reduce(node0));
   EXPECT_CALL(r2, Reduce(node0));
-  EXPECT_CALL(r3, Reduce(node0)).InSequence(s1, s2).WillOnce(
+  EXPECT_CALL(r3, Reduce(node0)).InSequence(s1, s2, s3).WillOnce(
       Return(Reducer::Changed(node0)));
   EXPECT_CALL(r1, Reduce(node0)).InSequence(s1);
   EXPECT_CALL(r2, Reduce(node0)).InSequence(s2);
+  EXPECT_CALL(r3, Reduce(node0)).InSequence(s3);
   ReduceNode(node0, &r1, &r2, &r3);
 }
 
index 36a54e0..07e8923 100644 (file)
@@ -22,7 +22,6 @@ static bool NodeIdIsLessThan(const Node* node, NodeId id) {
 
 
 void GraphReducer::ReduceNode(Node* node) {
-  ZoneVector<Reducer*>::iterator skip = reducers_.end();
   static const unsigned kMaxAttempts = 16;
   bool reduce = true;
   for (unsigned attempts = 0; attempts <= kMaxAttempts; ++attempts) {
@@ -31,17 +30,15 @@ void GraphReducer::ReduceNode(Node* node) {
     int before = graph_->NodeCount();
     for (ZoneVector<Reducer*>::iterator i = reducers_.begin();
          i != reducers_.end(); ++i) {
-      if (i == skip) continue;  // Skip this reducer.
       Reduction reduction = (*i)->Reduce(node);
       Node* replacement = reduction.replacement();
       if (replacement == NULL) {
         // No change from this reducer.
       } else if (replacement == node) {
         // {replacement == node} represents an in-place reduction.
-        // Rerun all the reducers except the current one for this node,
-        // as now there may be more opportunities for reduction.
+        // Rerun all the reducers for this node, as now there may be more
+        // opportunities for reduction.
         reduce = true;
-        skip = i;
         break;
       } else {
         if (node == graph_->start()) graph_->SetStart(replacement);
@@ -63,7 +60,6 @@ void GraphReducer::ReduceNode(Node* node) {
           node->Kill();
         }
         // Rerun all the reductions on the {replacement}.
-        skip = reducers_.end();
         node = replacement;
         reduce = true;
         break;