| OLD | NEW |
| 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/machine-operator-reducer.h" | 5 #include "src/compiler/machine-operator-reducer.h" |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/base/division-by-constant.h" | 8 #include "src/base/division-by-constant.h" |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/compiler/generic-node-inl.h" | 10 #include "src/compiler/generic-node-inl.h" |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); | 527 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); |
| 528 if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0)); | 528 if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0)); |
| 529 break; | 529 break; |
| 530 } | 530 } |
| 531 case IrOpcode::kTruncateFloat64ToFloat32: { | 531 case IrOpcode::kTruncateFloat64ToFloat32: { |
| 532 Float64Matcher m(node->InputAt(0)); | 532 Float64Matcher m(node->InputAt(0)); |
| 533 if (m.HasValue()) return ReplaceFloat32(DoubleToFloat32(m.Value())); | 533 if (m.HasValue()) return ReplaceFloat32(DoubleToFloat32(m.Value())); |
| 534 if (m.IsChangeFloat32ToFloat64()) return Replace(m.node()->InputAt(0)); | 534 if (m.IsChangeFloat32ToFloat64()) return Replace(m.node()->InputAt(0)); |
| 535 break; | 535 break; |
| 536 } | 536 } |
| 537 case IrOpcode::kStore: { | 537 case IrOpcode::kStore: |
| 538 Node* const value = node->InputAt(2); | 538 return ReduceStore(node); |
| 539 // TODO(turbofan): Extend to 64-bit? | |
| 540 if (value->opcode() == IrOpcode::kWord32And) { | |
| 541 MachineType const rep = static_cast<MachineType>( | |
| 542 StoreRepresentationOf(node->op()).machine_type() & kRepMask); | |
| 543 Uint32BinopMatcher m(value); | |
| 544 if (m.right().HasValue() && | |
| 545 ((rep == kRepWord8 && (m.right().Value() & 0xff) == 0xff) || | |
| 546 (rep == kRepWord16 && (m.right().Value() & 0xffff) == 0xffff))) { | |
| 547 node->ReplaceInput(2, m.left().node()); | |
| 548 return Changed(node); | |
| 549 } | |
| 550 } | |
| 551 break; | |
| 552 } | |
| 553 default: | 539 default: |
| 554 break; | 540 break; |
| 555 } | 541 } |
| 556 return NoChange(); | 542 return NoChange(); |
| 557 } | 543 } |
| 558 | 544 |
| 559 | 545 |
| 560 Reduction MachineOperatorReducer::ReduceInt32Div(Node* node) { | 546 Reduction MachineOperatorReducer::ReduceInt32Div(Node* node) { |
| 561 Int32BinopMatcher m(node); | 547 Int32BinopMatcher m(node); |
| 562 if (m.left().Is(0)) return Replace(m.left().node()); // 0 / x => 0 | 548 if (m.left().Is(0)) return Replace(m.left().node()); // 0 / x => 0 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 DCHECK_EQ(dividend, node->InputAt(0)); | 691 DCHECK_EQ(dividend, node->InputAt(0)); |
| 706 node->ReplaceInput(1, Int32Mul(quotient, Uint32Constant(divisor))); | 692 node->ReplaceInput(1, Int32Mul(quotient, Uint32Constant(divisor))); |
| 707 } | 693 } |
| 708 node->TrimInputCount(2); | 694 node->TrimInputCount(2); |
| 709 return Changed(node); | 695 return Changed(node); |
| 710 } | 696 } |
| 711 return NoChange(); | 697 return NoChange(); |
| 712 } | 698 } |
| 713 | 699 |
| 714 | 700 |
| 701 Reduction MachineOperatorReducer::ReduceStore(Node* node) { |
| 702 MachineType const rep = |
| 703 RepresentationOf(StoreRepresentationOf(node->op()).machine_type()); |
| 704 Node* const value = node->InputAt(2); |
| 705 switch (value->opcode()) { |
| 706 case IrOpcode::kWord32And: { |
| 707 Uint32BinopMatcher m(value); |
| 708 if (m.right().HasValue() && |
| 709 ((rep == kRepWord8 && (m.right().Value() & 0xff) == 0xff) || |
| 710 (rep == kRepWord16 && (m.right().Value() & 0xffff) == 0xffff))) { |
| 711 node->ReplaceInput(2, m.left().node()); |
| 712 return Changed(node); |
| 713 } |
| 714 break; |
| 715 } |
| 716 case IrOpcode::kWord32Sar: { |
| 717 Int32BinopMatcher m(value); |
| 718 if (m.left().IsWord32Shl() && |
| 719 ((rep == kRepWord8 && m.right().IsInRange(1, 24)) || |
| 720 (rep == kRepWord16 && m.right().IsInRange(1, 16)))) { |
| 721 Int32BinopMatcher mleft(m.left().node()); |
| 722 if (mleft.right().Is(m.right().Value())) { |
| 723 node->ReplaceInput(2, mleft.left().node()); |
| 724 return Changed(node); |
| 725 } |
| 726 } |
| 727 break; |
| 728 } |
| 729 default: |
| 730 break; |
| 731 } |
| 732 return NoChange(); |
| 733 } |
| 734 |
| 735 |
| 715 Reduction MachineOperatorReducer::ReduceProjection(size_t index, Node* node) { | 736 Reduction MachineOperatorReducer::ReduceProjection(size_t index, Node* node) { |
| 716 switch (node->opcode()) { | 737 switch (node->opcode()) { |
| 717 case IrOpcode::kInt32AddWithOverflow: { | 738 case IrOpcode::kInt32AddWithOverflow: { |
| 718 DCHECK(index == 0 || index == 1); | 739 DCHECK(index == 0 || index == 1); |
| 719 Int32BinopMatcher m(node); | 740 Int32BinopMatcher m(node); |
| 720 if (m.IsFoldable()) { | 741 if (m.IsFoldable()) { |
| 721 int32_t val; | 742 int32_t val; |
| 722 bool ovf = base::bits::SignedAddOverflow32(m.left().Value(), | 743 bool ovf = base::bits::SignedAddOverflow32(m.left().Value(), |
| 723 m.right().Value(), &val); | 744 m.right().Value(), &val); |
| 724 return ReplaceInt32((index == 0) ? val : ovf); | 745 return ReplaceInt32((index == 0) ? val : ovf); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 757 MachineOperatorBuilder* MachineOperatorReducer::machine() const { | 778 MachineOperatorBuilder* MachineOperatorReducer::machine() const { |
| 758 return jsgraph()->machine(); | 779 return jsgraph()->machine(); |
| 759 } | 780 } |
| 760 | 781 |
| 761 | 782 |
| 762 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } | 783 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } |
| 763 | 784 |
| 764 } // namespace compiler | 785 } // namespace compiler |
| 765 } // namespace internal | 786 } // namespace internal |
| 766 } // namespace v8 | 787 } // namespace v8 |
| OLD | NEW |