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

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

Issue 859053002: [turbofan] Pull ResizeMergeOrPhi into CommonOperatorBuilder and use in ControlReducer. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 11 months 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/common-operator.cc ('k') | src/compiler/loop-peeling.cc » ('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-marker.h" 9 #include "src/compiler/node-marker.h"
10 #include "src/compiler/node-matchers.h" 10 #include "src/compiler/node-matchers.h"
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 ReplaceNode(use, (result == kTrue) ? dead() : control); 502 ReplaceNode(use, (result == kTrue) ? dead() : control);
503 control = NodeProperties::GetControlInput(node); // Could change! 503 control = NodeProperties::GetControlInput(node); // Could change!
504 } 504 }
505 } 505 }
506 return control; 506 return control;
507 } 507 }
508 508
509 // Remove inputs to {node} corresponding to the dead inputs to {merge} 509 // Remove inputs to {node} corresponding to the dead inputs to {merge}
510 // and compact the remaining inputs, updating the operator. 510 // and compact the remaining inputs, updating the operator.
511 void RemoveDeadInputs(Node* merge, Node* node) { 511 void RemoveDeadInputs(Node* merge, Node* node) {
512 int pos = 0; 512 int live = 0;
513 for (int i = 0; i < node->InputCount(); i++) { 513 for (int i = 0; i < merge->InputCount(); i++) {
514 // skip dead inputs. 514 // skip dead inputs.
515 if (i < merge->InputCount() && 515 if (merge->InputAt(i)->opcode() == IrOpcode::kDead) continue;
516 merge->InputAt(i)->opcode() == IrOpcode::kDead)
517 continue;
518 // compact live inputs. 516 // compact live inputs.
519 if (pos != i) node->ReplaceInput(pos, node->InputAt(i)); 517 if (live != i) node->ReplaceInput(live, node->InputAt(i));
520 pos++; 518 live++;
521 } 519 }
522 node->TrimInputCount(pos); 520 // compact remaining inputs.
523 if (node->opcode() == IrOpcode::kPhi) { 521 int total = live;
524 node->set_op(common_->Phi(OpParameter<MachineType>(node->op()), pos - 1)); 522 for (int i = merge->InputCount(); i < node->InputCount(); i++) {
525 } else if (node->opcode() == IrOpcode::kEffectPhi) { 523 if (total != i) node->ReplaceInput(total, node->InputAt(i));
526 node->set_op(common_->EffectPhi(pos - 1)); 524 total++;
527 } else if (node->opcode() == IrOpcode::kMerge) {
528 node->set_op(common_->Merge(pos));
529 } else if (node->opcode() == IrOpcode::kLoop) {
530 node->set_op(common_->Loop(pos));
531 } else {
532 UNREACHABLE();
533 } 525 }
526 DCHECK_EQ(total, live + node->InputCount() - merge->InputCount());
527 DCHECK_NE(total, node->InputCount());
528 node->TrimInputCount(total);
529 node->set_op(common_->ResizeMergeOrPhi(node->op(), live));
534 } 530 }
535 531
536 // Replace uses of {node} with {replacement} and revisit the uses. 532 // Replace uses of {node} with {replacement} and revisit the uses.
537 void ReplaceNode(Node* node, Node* replacement) { 533 void ReplaceNode(Node* node, Node* replacement) {
538 if (node == replacement) return; 534 if (node == replacement) return;
539 TRACE((" Replace: #%d:%s with #%d:%s\n", node->id(), 535 TRACE((" Replace: #%d:%s with #%d:%s\n", node->id(),
540 node->op()->mnemonic(), replacement->id(), 536 node->op()->mnemonic(), replacement->id(),
541 replacement->op()->mnemonic())); 537 replacement->op()->mnemonic()));
542 for (Node* const use : node->uses()) { 538 for (Node* const use : node->uses()) {
543 // Don't revisit this node if it refers to itself. 539 // Don't revisit this node if it refers to itself.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, 581 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph,
586 CommonOperatorBuilder* common, 582 CommonOperatorBuilder* common,
587 Node* node) { 583 Node* node) {
588 Zone zone(jsgraph->graph()->zone()->isolate()); 584 Zone zone(jsgraph->graph()->zone()->isolate());
589 ControlReducerImpl impl(&zone, jsgraph, common); 585 ControlReducerImpl impl(&zone, jsgraph, common);
590 return impl.ReduceBranch(node); 586 return impl.ReduceBranch(node);
591 } 587 }
592 } 588 }
593 } 589 }
594 } // namespace v8::internal::compiler 590 } // namespace v8::internal::compiler
OLDNEW
« no previous file with comments | « src/compiler/common-operator.cc ('k') | src/compiler/loop-peeling.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698