From 2f21ddfbfab5238b7555149d1e8b1f1bc6e73dc8 Mon Sep 17 00:00:00 2001 From: "bmeurer@chromium.org" Date: Fri, 26 Sep 2014 06:40:07 +0000 Subject: [PATCH] [turbofan] GraphReducer is more "fixpointish" now. 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 | 5 +++-- src/compiler/graph-reducer.cc | 8 ++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/compiler/graph-reducer-unittest.cc b/src/compiler/graph-reducer-unittest.cc index 6567203..2729d58 100644 --- a/src/compiler/graph-reducer-unittest.cc +++ b/src/compiler/graph-reducer-unittest.cc @@ -97,15 +97,16 @@ TEST_F(GraphReducerTest, ReduceOnceForEveryReducer) { TEST_F(GraphReducerTest, ReduceAgainAfterChanged) { - Sequence s1, s2; + Sequence s1, s2, s3; StrictMock 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); } diff --git a/src/compiler/graph-reducer.cc b/src/compiler/graph-reducer.cc index 36a54e0..07e8923 100644 --- a/src/compiler/graph-reducer.cc +++ b/src/compiler/graph-reducer.cc @@ -22,7 +22,6 @@ static bool NodeIdIsLessThan(const Node* node, NodeId id) { void GraphReducer::ReduceNode(Node* node) { - ZoneVector::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::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; -- 2.7.4