| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/loop-variable-optimizer.h" | 5 #include "src/compiler/loop-variable-optimizer.h" |
| 6 | 6 |
| 7 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
| 8 #include "src/compiler/graph.h" | 8 #include "src/compiler/graph.h" |
| 9 #include "src/compiler/node-marker.h" | 9 #include "src/compiler/node-marker.h" |
| 10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 do { \ | 21 do { \ |
| 22 if (FLAG_trace_turbo_loop) PrintF(__VA_ARGS__); \ | 22 if (FLAG_trace_turbo_loop) PrintF(__VA_ARGS__); \ |
| 23 } while (false) | 23 } while (false) |
| 24 | 24 |
| 25 LoopVariableOptimizer::LoopVariableOptimizer(Graph* graph, | 25 LoopVariableOptimizer::LoopVariableOptimizer(Graph* graph, |
| 26 CommonOperatorBuilder* common, | 26 CommonOperatorBuilder* common, |
| 27 Zone* zone) | 27 Zone* zone) |
| 28 : graph_(graph), | 28 : graph_(graph), |
| 29 common_(common), | 29 common_(common), |
| 30 zone_(zone), | 30 zone_(zone), |
| 31 limits_(zone), | 31 limits_(graph->NodeCount(), zone), |
| 32 induction_vars_(zone) {} | 32 induction_vars_(zone) {} |
| 33 | 33 |
| 34 void LoopVariableOptimizer::Run() { | 34 void LoopVariableOptimizer::Run() { |
| 35 ZoneQueue<Node*> queue(zone()); | 35 ZoneQueue<Node*> queue(zone()); |
| 36 queue.push(graph()->start()); | 36 queue.push(graph()->start()); |
| 37 NodeMarker<bool> queued(graph(), 2); | 37 NodeMarker<bool> queued(graph(), 2); |
| 38 while (!queue.empty()) { | 38 while (!queue.empty()) { |
| 39 Node* node = queue.front(); | 39 Node* node = queue.front(); |
| 40 queue.pop(); | 40 queue.pop(); |
| 41 queued.Set(node, false); | 41 queued.Set(node, false); |
| 42 | 42 |
| 43 DCHECK(limits_.find(node->id()) == limits_.end()); | 43 DCHECK_NULL(limits_[node->id()]); |
| 44 bool all_inputs_visited = true; | 44 bool all_inputs_visited = true; |
| 45 int inputs_end = (node->opcode() == IrOpcode::kLoop) | 45 int inputs_end = (node->opcode() == IrOpcode::kLoop) |
| 46 ? kFirstBackedge | 46 ? kFirstBackedge |
| 47 : node->op()->ControlInputCount(); | 47 : node->op()->ControlInputCount(); |
| 48 for (int i = 0; i < inputs_end; i++) { | 48 for (int i = 0; i < inputs_end; i++) { |
| 49 auto input = limits_.find(NodeProperties::GetControlInput(node, i)->id()); | 49 if (limits_[NodeProperties::GetControlInput(node, i)->id()] == nullptr) { |
| 50 if (input == limits_.end()) { | |
| 51 all_inputs_visited = false; | 50 all_inputs_visited = false; |
| 52 break; | 51 break; |
| 53 } | 52 } |
| 54 } | 53 } |
| 55 if (!all_inputs_visited) continue; | 54 if (!all_inputs_visited) continue; |
| 56 | 55 |
| 57 VisitNode(node); | 56 VisitNode(node); |
| 58 DCHECK(limits_.find(node->id()) != limits_.end()); | 57 DCHECK_NOT_NULL(limits_[node->id()]); |
| 59 | 58 |
| 60 // Queue control outputs. | 59 // Queue control outputs. |
| 61 for (Edge edge : node->use_edges()) { | 60 for (Edge edge : node->use_edges()) { |
| 62 if (NodeProperties::IsControlEdge(edge) && | 61 if (NodeProperties::IsControlEdge(edge) && |
| 63 edge.from()->op()->ControlOutputCount() > 0) { | 62 edge.from()->op()->ControlOutputCount() > 0) { |
| 64 Node* use = edge.from(); | 63 Node* use = edge.from(); |
| 65 if (use->opcode() == IrOpcode::kLoop && | 64 if (use->opcode() == IrOpcode::kLoop && |
| 66 edge.index() != kAssumedLoopEntryIndex) { | 65 edge.index() != kAssumedLoopEntryIndex) { |
| 67 VisitBackedge(node, use); | 66 VisitBackedge(node, use); |
| 68 } else if (!queued.Get(use)) { | 67 } else if (!queued.Get(use)) { |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 backedge_value, backedge_control); | 396 backedge_value, backedge_control); |
| 398 induction_var->phi()->ReplaceInput(1, rename); | 397 induction_var->phi()->ReplaceInput(1, rename); |
| 399 } | 398 } |
| 400 } | 399 } |
| 401 } | 400 } |
| 402 } | 401 } |
| 403 | 402 |
| 404 } // namespace compiler | 403 } // namespace compiler |
| 405 } // namespace internal | 404 } // namespace internal |
| 406 } // namespace v8 | 405 } // namespace v8 |
| OLD | NEW |