[turbofan] Avoid repeatedly revisiting inputs in GraphReducer.

R=mstarzinger@chromium.org
BUG=

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

Cr-Commit-Position: refs/heads/master@{#25551}
This commit is contained in:
titzer 2014-11-27 08:24:08 -08:00 committed by Commit bot
parent 34702e9d59
commit 76178f1ddb
2 changed files with 20 additions and 17 deletions

View File

@ -99,11 +99,22 @@ Reduction GraphReducer::Reduce(Node* const node) {
void GraphReducer::ReduceTop() { void GraphReducer::ReduceTop() {
Node* const node = Top(); NodeState& entry = stack_.top();
Node* node = entry.node;
DCHECK(state_[node->id()] == State::kOnStack);
if (node->IsDead()) return Pop(); // Node was killed while on stack. if (node->IsDead()) return Pop(); // Node was killed while on stack.
// Recurse on an input if necessary. // Recurse on an input if necessary.
for (auto const input : node->inputs()) { int start = entry.input_index < node->InputCount() ? entry.input_index : 0;
for (int i = start; i < node->InputCount(); i++) {
Node* input = node->InputAt(i);
entry.input_index = i + 1;
if (input != node && Recurse(input)) return;
}
for (int i = 0; i < start; i++) {
Node* input = node->InputAt(i);
entry.input_index = i + 1;
if (input != node && Recurse(input)) return; if (input != node && Recurse(input)) return;
} }
@ -153,7 +164,7 @@ void GraphReducer::ReduceTop() {
void GraphReducer::Pop() { void GraphReducer::Pop() {
Node* const node = Top(); Node* const node = stack_.top().node;
state_[node->id()] = State::kVisited; state_[node->id()] = State::kVisited;
stack_.pop(); stack_.pop();
} }
@ -165,18 +176,7 @@ void GraphReducer::Push(Node* const node) {
DCHECK(id < state_.size()); DCHECK(id < state_.size());
DCHECK(state_[id] != State::kOnStack); DCHECK(state_[id] != State::kOnStack);
state_[id] = State::kOnStack; state_[id] = State::kOnStack;
stack_.push(node); stack_.push({node, 0});
}
Node* GraphReducer::Top() const {
DCHECK(!stack_.empty());
Node* const node = stack_.top();
size_t const id = static_cast<size_t>(node->id());
DCHECK(id < state_.size());
DCHECK(state_[id] == State::kOnStack);
USE(id);
return node;
} }

View File

@ -68,6 +68,10 @@ class GraphReducer FINAL {
private: private:
enum class State : uint8_t; enum class State : uint8_t;
struct NodeState {
Node* node;
int input_index;
};
// Reduce a single node. // Reduce a single node.
Reduction Reduce(Node* const); Reduction Reduce(Node* const);
@ -77,7 +81,6 @@ class GraphReducer FINAL {
// Node stack operations. // Node stack operations.
void Pop(); void Pop();
void Push(Node* const); void Push(Node* const);
Node* Top() const;
// Revisit queue operations. // Revisit queue operations.
bool Recurse(Node* const); bool Recurse(Node* const);
@ -86,7 +89,7 @@ class GraphReducer FINAL {
Graph* graph_; Graph* graph_;
ZoneVector<Reducer*> reducers_; ZoneVector<Reducer*> reducers_;
ZoneStack<Node*> revisit_; ZoneStack<Node*> revisit_;
ZoneStack<Node*> stack_; ZoneStack<NodeState> stack_;
ZoneDeque<State> state_; ZoneDeque<State> state_;
DISALLOW_COPY_AND_ASSIGN(GraphReducer); DISALLOW_COPY_AND_ASSIGN(GraphReducer);