| Index: src/compiler/graph-reducer.cc
|
| diff --git a/src/compiler/graph-reducer.cc b/src/compiler/graph-reducer.cc
|
| index 26163bf41613ddbaaf6d07eb7437af315b14ef9e..1f56b302edce5a180599b2b925b178034c11f98a 100644
|
| --- a/src/compiler/graph-reducer.cc
|
| +++ b/src/compiler/graph-reducer.cc
|
| @@ -22,10 +22,10 @@ enum class GraphReducer::State : uint8_t {
|
|
|
| GraphReducer::GraphReducer(Graph* graph, Zone* zone)
|
| : graph_(graph),
|
| + state_(graph, 4),
|
| reducers_(zone),
|
| revisit_(zone),
|
| - stack_(zone),
|
| - state_(zone) {}
|
| + stack_(zone) {}
|
|
|
|
|
| void GraphReducer::AddReducer(Reducer* reducer) {
|
| @@ -36,12 +36,8 @@ void GraphReducer::AddReducer(Reducer* reducer) {
|
| void GraphReducer::ReduceNode(Node* node) {
|
| DCHECK(stack_.empty());
|
| DCHECK(revisit_.empty());
|
| - std::fill(state_.begin(), state_.end(), State::kUnvisited);
|
| Push(node);
|
| for (;;) {
|
| - DCHECK(!stack_.empty() ||
|
| - std::find(state_.begin(), state_.end(), State::kOnStack) ==
|
| - state_.end());
|
| if (!stack_.empty()) {
|
| // Process the node on the top of the stack, potentially pushing more or
|
| // popping the node off the stack.
|
| @@ -50,7 +46,7 @@ void GraphReducer::ReduceNode(Node* node) {
|
| // If the stack becomes empty, revisit any nodes in the revisit queue.
|
| Node* const node = revisit_.top();
|
| revisit_.pop();
|
| - if (state_[node->id()] == State::kRevisit) {
|
| + if (state_.Get(node) == State::kRevisit) {
|
| // state can change while in queue.
|
| Push(node);
|
| }
|
| @@ -58,8 +54,6 @@ void GraphReducer::ReduceNode(Node* node) {
|
| break;
|
| }
|
| }
|
| - DCHECK(std::find(state_.begin(), state_.end(), State::kOnStack) ==
|
| - state_.end());
|
| DCHECK(revisit_.empty());
|
| DCHECK(stack_.empty());
|
| }
|
| @@ -101,7 +95,7 @@ Reduction GraphReducer::Reduce(Node* const node) {
|
| void GraphReducer::ReduceTop() {
|
| NodeState& entry = stack_.top();
|
| Node* node = entry.node;
|
| - DCHECK(state_[node->id()] == State::kOnStack);
|
| + DCHECK(state_.Get(node) == State::kOnStack);
|
|
|
| if (node->IsDead()) return Pop(); // Node was killed while on stack.
|
|
|
| @@ -164,34 +158,29 @@ void GraphReducer::ReduceTop() {
|
|
|
|
|
| void GraphReducer::Pop() {
|
| - Node* const node = stack_.top().node;
|
| - state_[node->id()] = State::kVisited;
|
| + Node* node = stack_.top().node;
|
| + state_.Set(node, State::kVisited);
|
| stack_.pop();
|
| }
|
|
|
|
|
| void GraphReducer::Push(Node* const node) {
|
| - size_t const id = static_cast<size_t>(node->id());
|
| - if (id >= state_.size()) state_.resize(id + 1);
|
| - DCHECK(id < state_.size());
|
| - DCHECK(state_[id] != State::kOnStack);
|
| - state_[id] = State::kOnStack;
|
| + DCHECK(state_.Get(node) != State::kOnStack);
|
| + state_.Set(node, State::kOnStack);
|
| stack_.push({node, 0});
|
| }
|
|
|
|
|
| -bool GraphReducer::Recurse(Node* const node) {
|
| - size_t const id = static_cast<size_t>(node->id());
|
| - if (id < state_.size() && state_[id] > State::kRevisit) return false;
|
| +bool GraphReducer::Recurse(Node* node) {
|
| + if (state_.Get(node) > State::kRevisit) return false;
|
| Push(node);
|
| return true;
|
| }
|
|
|
|
|
| -void GraphReducer::Revisit(Node* const node) {
|
| - size_t const id = static_cast<size_t>(node->id());
|
| - if (id < state_.size() && state_[id] == State::kVisited) {
|
| - state_[id] = State::kRevisit;
|
| +void GraphReducer::Revisit(Node* node) {
|
| + if (state_.Get(node) == State::kVisited) {
|
| + state_.Set(node, State::kRevisit);
|
| revisit_.push(node);
|
| }
|
| }
|
|
|