Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(340)

Side by Side Diff: src/compiler/control-reducer.cc

Issue 765983002: Clean up node iteration (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix windows build Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/change-lowering.cc ('k') | src/compiler/generic-algorithm.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/common-operator.h" 5 #include "src/compiler/common-operator.h"
6 #include "src/compiler/control-reducer.h" 6 #include "src/compiler/control-reducer.h"
7 #include "src/compiler/graph.h" 7 #include "src/compiler/graph.h"
8 #include "src/compiler/js-graph.h" 8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 230
231 // Process cached nodes in the JSGraph too. 231 // Process cached nodes in the JSGraph too.
232 jsgraph_->GetCachedNodes(&nodes); 232 jsgraph_->GetCachedNodes(&nodes);
233 TrimNodes(marked, nodes); 233 TrimNodes(marked, nodes);
234 } 234 }
235 235
236 void TrimNodes(ReachabilityMarker& marked, NodeVector& nodes) { 236 void TrimNodes(ReachabilityMarker& marked, NodeVector& nodes) {
237 // Remove dead->live edges. 237 // Remove dead->live edges.
238 for (size_t j = 0; j < nodes.size(); j++) { 238 for (size_t j = 0; j < nodes.size(); j++) {
239 Node* node = nodes[j]; 239 Node* node = nodes[j];
240 for (UseIter i = node->uses().begin(); i != node->uses().end();) { 240 for (Edge edge : node->use_edges()) {
241 if (!marked.IsReachableFromEnd(*i)) { 241 Node* use = edge.from();
242 TRACE(("DeadLink: #%d:%s(%d) -> #%d:%s\n", (*i)->id(), 242 if (!marked.IsReachableFromEnd(use)) {
243 (*i)->op()->mnemonic(), i.index(), node->id(), 243 TRACE(("DeadLink: #%d:%s(%d) -> #%d:%s\n", use->id(),
244 use->op()->mnemonic(), edge.index(), node->id(),
244 node->op()->mnemonic())); 245 node->op()->mnemonic()));
245 i.UpdateToAndIncrement(NULL); 246 edge.UpdateTo(NULL);
246 } else {
247 ++i;
248 } 247 }
249 } 248 }
250 } 249 }
251 #if DEBUG 250 #if DEBUG
252 // Verify that no inputs to live nodes are NULL. 251 // Verify that no inputs to live nodes are NULL.
253 for (size_t j = 0; j < nodes.size(); j++) { 252 for (size_t j = 0; j < nodes.size(); j++) {
254 Node* node = nodes[j]; 253 Node* node = nodes[j];
255 for (Node* const input : node->inputs()) { 254 for (Node* const input : node->inputs()) {
256 CHECK_NE(NULL, input); 255 CHECK_NE(NULL, input);
257 } 256 }
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 // Reduce branches if they have constant inputs. 465 // Reduce branches if they have constant inputs.
467 Node* ReduceBranch(Node* node) { 466 Node* ReduceBranch(Node* node) {
468 Decision result = DecideCondition(node->InputAt(0)); 467 Decision result = DecideCondition(node->InputAt(0));
469 if (result == kUnknown) return node; 468 if (result == kUnknown) return node;
470 469
471 TRACE(("BranchReduce: #%d:%s = %s\n", node->id(), node->op()->mnemonic(), 470 TRACE(("BranchReduce: #%d:%s = %s\n", node->id(), node->op()->mnemonic(),
472 (result == kTrue) ? "true" : "false")); 471 (result == kTrue) ? "true" : "false"));
473 472
474 // Replace IfTrue and IfFalse projections from this branch. 473 // Replace IfTrue and IfFalse projections from this branch.
475 Node* control = NodeProperties::GetControlInput(node); 474 Node* control = NodeProperties::GetControlInput(node);
476 for (UseIter i = node->uses().begin(); i != node->uses().end();) { 475 for (Edge edge : node->use_edges()) {
477 Node* to = *i; 476 Node* use = edge.from();
478 if (to->opcode() == IrOpcode::kIfTrue) { 477 if (use->opcode() == IrOpcode::kIfTrue) {
479 TRACE((" IfTrue: #%d:%s\n", to->id(), to->op()->mnemonic())); 478 TRACE((" IfTrue: #%d:%s\n", use->id(), use->op()->mnemonic()));
480 i.UpdateToAndIncrement(NULL); 479 edge.UpdateTo(NULL);
481 ReplaceNode(to, (result == kTrue) ? control : dead()); 480 ReplaceNode(use, (result == kTrue) ? control : dead());
482 } else if (to->opcode() == IrOpcode::kIfFalse) { 481 } else if (use->opcode() == IrOpcode::kIfFalse) {
483 TRACE((" IfFalse: #%d:%s\n", to->id(), to->op()->mnemonic())); 482 TRACE((" IfFalse: #%d:%s\n", use->id(), use->op()->mnemonic()));
484 i.UpdateToAndIncrement(NULL); 483 edge.UpdateTo(NULL);
485 ReplaceNode(to, (result == kTrue) ? dead() : control); 484 ReplaceNode(use, (result == kTrue) ? dead() : control);
486 } else {
487 ++i;
488 } 485 }
489 } 486 }
490 return control; 487 return control;
491 } 488 }
492 489
493 // Remove inputs to {node} corresponding to the dead inputs to {merge} 490 // Remove inputs to {node} corresponding to the dead inputs to {merge}
494 // and compact the remaining inputs, updating the operator. 491 // and compact the remaining inputs, updating the operator.
495 void RemoveDeadInputs(Node* merge, Node* node) { 492 void RemoveDeadInputs(Node* merge, Node* node) {
496 int pos = 0; 493 int pos = 0;
497 for (int i = 0; i < node->InputCount(); i++) { 494 for (int i = 0; i < node->InputCount(); i++) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, 566 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph,
570 CommonOperatorBuilder* common, 567 CommonOperatorBuilder* common,
571 Node* node) { 568 Node* node) {
572 Zone zone(jsgraph->graph()->zone()->isolate()); 569 Zone zone(jsgraph->graph()->zone()->isolate());
573 ControlReducerImpl impl(&zone, jsgraph, common); 570 ControlReducerImpl impl(&zone, jsgraph, common);
574 return impl.ReduceBranch(node); 571 return impl.ReduceBranch(node);
575 } 572 }
576 } 573 }
577 } 574 }
578 } // namespace v8::internal::compiler 575 } // namespace v8::internal::compiler
OLDNEW
« no previous file with comments | « src/compiler/change-lowering.cc ('k') | src/compiler/generic-algorithm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698