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

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

Issue 1053583005: [turbofan] Reduce duplication between ControlReducer::ReduceIf(True,False). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 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 | « no previous file | no next file » | 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 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 TRACE("ControlDead: #%d:%s\n", node->id(), node->op()->mnemonic()); 409 TRACE("ControlDead: #%d:%s\n", node->id(), node->op()->mnemonic());
410 return control; 410 return control;
411 } 411 }
412 } 412 }
413 413
414 // Reduce branches, phis, and merges. 414 // Reduce branches, phis, and merges.
415 switch (node->opcode()) { 415 switch (node->opcode()) {
416 case IrOpcode::kBranch: 416 case IrOpcode::kBranch:
417 return ReduceBranch(node); 417 return ReduceBranch(node);
418 case IrOpcode::kIfTrue: 418 case IrOpcode::kIfTrue:
419 return ReduceIfTrue(node); 419 return ReduceIfProjection(node, kTrue);
420 case IrOpcode::kIfFalse: 420 case IrOpcode::kIfFalse:
421 return ReduceIfFalse(node); 421 return ReduceIfProjection(node, kFalse);
422 case IrOpcode::kLoop: 422 case IrOpcode::kLoop:
423 case IrOpcode::kMerge: 423 case IrOpcode::kMerge:
424 return ReduceMerge(node); 424 return ReduceMerge(node);
425 case IrOpcode::kSelect: 425 case IrOpcode::kSelect:
426 return ReduceSelect(node); 426 return ReduceSelect(node);
427 case IrOpcode::kPhi: 427 case IrOpcode::kPhi:
428 case IrOpcode::kEffectPhi: 428 case IrOpcode::kEffectPhi:
429 return ReducePhi(node); 429 return ReducePhi(node);
430 default: 430 default:
431 return node; 431 return node;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 node0->op()->mnemonic(), node1->id(), node1->op()->mnemonic(), 569 node0->op()->mnemonic(), node1->id(), node1->op()->mnemonic(),
570 branch0->id(), branch0->op()->mnemonic()); 570 branch0->id(), branch0->op()->mnemonic());
571 return NodeProperties::GetControlInput(branch0); 571 return NodeProperties::GetControlInput(branch0);
572 } 572 }
573 } 573 }
574 } 574 }
575 575
576 return node; 576 return node;
577 } 577 }
578 578
579 // Reduce branches if they have constant inputs. 579 // Reduce if projections if the branch has a constant input.
580 Node* ReduceIfTrue(Node* node) { 580 Node* ReduceIfProjection(Node* node, Decision decision) {
581 Node* branch = node->InputAt(0); 581 Node* branch = node->InputAt(0);
582 DCHECK_EQ(IrOpcode::kBranch, branch->opcode()); 582 DCHECK_EQ(IrOpcode::kBranch, branch->opcode());
583 Decision result = DecideCondition(branch->InputAt(0)); 583 Decision result = DecideCondition(branch->InputAt(0));
584 if (result == kTrue) { 584 if (result == decision) {
585 // fold a true branch by replacing IfTrue with the branch control. 585 // Fold a branch by replacing IfTrue/IfFalse with the branch control.
586 TRACE(" BranchReduce: #%d:%s => #%d:%s\n", branch->id(), 586 TRACE(" BranchReduce: #%d:%s => #%d:%s\n", branch->id(),
587 branch->op()->mnemonic(), node->id(), node->op()->mnemonic()); 587 branch->op()->mnemonic(), node->id(), node->op()->mnemonic());
588 return branch->InputAt(1); 588 return branch->InputAt(1);
589 }
590 return result == kUnknown ? node : dead();
591 }
592
593 // Reduce branches if they have constant inputs.
594 Node* ReduceIfFalse(Node* node) {
595 Node* branch = node->InputAt(0);
596 DCHECK_EQ(IrOpcode::kBranch, branch->opcode());
597 Decision result = DecideCondition(branch->InputAt(0));
598 if (result == kFalse) {
599 // fold a false branch by replacing IfFalse with the branch control.
600 TRACE(" BranchReduce: #%d:%s => #%d:%s\n", branch->id(),
601 branch->op()->mnemonic(), node->id(), node->op()->mnemonic());
602 return branch->InputAt(1);
603 } 589 }
604 return result == kUnknown ? node : dead(); 590 return result == kUnknown ? node : dead();
605 } 591 }
606 592
607 // Remove inputs to {node} corresponding to the dead inputs to {merge} 593 // Remove inputs to {node} corresponding to the dead inputs to {merge}
608 // and compact the remaining inputs, updating the operator. 594 // and compact the remaining inputs, updating the operator.
609 void RemoveDeadInputs(Node* merge, Node* node) { 595 void RemoveDeadInputs(Node* merge, Node* node) {
610 int live = 0; 596 int live = 0;
611 for (int i = 0; i < merge->InputCount(); i++) { 597 for (int i = 0; i < merge->InputCount(); i++) {
612 // skip dead inputs. 598 // skip dead inputs.
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 } 660 }
675 661
676 662
677 Node* ControlReducer::ReduceIfNodeForTesting(JSGraph* jsgraph, 663 Node* ControlReducer::ReduceIfNodeForTesting(JSGraph* jsgraph,
678 CommonOperatorBuilder* common, 664 CommonOperatorBuilder* common,
679 Node* node) { 665 Node* node) {
680 Zone zone; 666 Zone zone;
681 ControlReducerImpl impl(&zone, jsgraph, common); 667 ControlReducerImpl impl(&zone, jsgraph, common);
682 switch (node->opcode()) { 668 switch (node->opcode()) {
683 case IrOpcode::kIfTrue: 669 case IrOpcode::kIfTrue:
684 return impl.ReduceIfTrue(node); 670 return impl.ReduceIfProjection(node, kTrue);
685 case IrOpcode::kIfFalse: 671 case IrOpcode::kIfFalse:
686 return impl.ReduceIfFalse(node); 672 return impl.ReduceIfProjection(node, kFalse);
687 default: 673 default:
688 return node; 674 return node;
689 } 675 }
690 } 676 }
691 } 677 }
692 } 678 }
693 } // namespace v8::internal::compiler 679 } // namespace v8::internal::compiler
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698