| 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/diamond.h" | 10 #include "src/compiler/diamond.h" |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 int32_t const divisor = Abs(m.right().Value()); | 593 int32_t const divisor = Abs(m.right().Value()); |
| 594 if (base::bits::IsPowerOfTwo32(divisor)) { | 594 if (base::bits::IsPowerOfTwo32(divisor)) { |
| 595 uint32_t const mask = divisor - 1; | 595 uint32_t const mask = divisor - 1; |
| 596 Node* const zero = Int32Constant(0); | 596 Node* const zero = Int32Constant(0); |
| 597 node->ReplaceInput( | 597 node->ReplaceInput( |
| 598 0, graph()->NewNode(machine()->Int32LessThan(), dividend, zero)); | 598 0, graph()->NewNode(machine()->Int32LessThan(), dividend, zero)); |
| 599 node->ReplaceInput( | 599 node->ReplaceInput( |
| 600 1, Int32Sub(zero, Word32And(Int32Sub(zero, dividend), mask))); | 600 1, Int32Sub(zero, Word32And(Int32Sub(zero, dividend), mask))); |
| 601 node->ReplaceInput(2, Word32And(dividend, mask)); | 601 node->ReplaceInput(2, Word32And(dividend, mask)); |
| 602 NodeProperties::ChangeOp( | 602 NodeProperties::ChangeOp( |
| 603 node, common()->Select(kMachInt32, BranchHint::kFalse)); | 603 node, |
| 604 common()->Select(MachineRepresentation::kWord32, BranchHint::kFalse)); |
| 604 } else { | 605 } else { |
| 605 Node* quotient = Int32Div(dividend, divisor); | 606 Node* quotient = Int32Div(dividend, divisor); |
| 606 DCHECK_EQ(dividend, node->InputAt(0)); | 607 DCHECK_EQ(dividend, node->InputAt(0)); |
| 607 node->ReplaceInput(1, Int32Mul(quotient, Int32Constant(divisor))); | 608 node->ReplaceInput(1, Int32Mul(quotient, Int32Constant(divisor))); |
| 608 node->TrimInputCount(2); | 609 node->TrimInputCount(2); |
| 609 NodeProperties::ChangeOp(node, machine()->Int32Sub()); | 610 NodeProperties::ChangeOp(node, machine()->Int32Sub()); |
| 610 } | 611 } |
| 611 return Changed(node); | 612 return Changed(node); |
| 612 } | 613 } |
| 613 return NoChange(); | 614 return NoChange(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 643 return NoChange(); | 644 return NoChange(); |
| 644 } | 645 } |
| 645 | 646 |
| 646 | 647 |
| 647 Reduction MachineOperatorReducer::ReduceTruncateFloat64ToInt32(Node* node) { | 648 Reduction MachineOperatorReducer::ReduceTruncateFloat64ToInt32(Node* node) { |
| 648 Float64Matcher m(node->InputAt(0)); | 649 Float64Matcher m(node->InputAt(0)); |
| 649 if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); | 650 if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); |
| 650 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); | 651 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); |
| 651 if (m.IsPhi()) { | 652 if (m.IsPhi()) { |
| 652 Node* const phi = m.node(); | 653 Node* const phi = m.node(); |
| 653 DCHECK_EQ(kRepFloat64, RepresentationOf(OpParameter<MachineType>(phi))); | 654 DCHECK_EQ(MachineRepresentation::kFloat64, PhiRepresentationOf(phi->op())); |
| 654 if (phi->OwnedBy(node)) { | 655 if (phi->OwnedBy(node)) { |
| 655 // TruncateFloat64ToInt32[mode](Phi[Float64](x1,...,xn)) | 656 // TruncateFloat64ToInt32[mode](Phi[Float64](x1,...,xn)) |
| 656 // => Phi[Int32](TruncateFloat64ToInt32[mode](x1), | 657 // => Phi[Int32](TruncateFloat64ToInt32[mode](x1), |
| 657 // ..., | 658 // ..., |
| 658 // TruncateFloat64ToInt32[mode](xn)) | 659 // TruncateFloat64ToInt32[mode](xn)) |
| 659 const int value_input_count = phi->InputCount() - 1; | 660 const int value_input_count = phi->InputCount() - 1; |
| 660 for (int i = 0; i < value_input_count; ++i) { | 661 for (int i = 0; i < value_input_count; ++i) { |
| 661 Node* input = graph()->NewNode(node->op(), phi->InputAt(i)); | 662 Node* input = graph()->NewNode(node->op(), phi->InputAt(i)); |
| 662 // TODO(bmeurer): Reschedule input for reduction once we have Revisit() | 663 // TODO(bmeurer): Reschedule input for reduction once we have Revisit() |
| 663 // instead of recursing into ReduceTruncateFloat64ToInt32() here. | 664 // instead of recursing into ReduceTruncateFloat64ToInt32() here. |
| 664 Reduction reduction = ReduceTruncateFloat64ToInt32(input); | 665 Reduction reduction = ReduceTruncateFloat64ToInt32(input); |
| 665 if (reduction.Changed()) input = reduction.replacement(); | 666 if (reduction.Changed()) input = reduction.replacement(); |
| 666 phi->ReplaceInput(i, input); | 667 phi->ReplaceInput(i, input); |
| 667 } | 668 } |
| 668 NodeProperties::ChangeOp(phi, | 669 NodeProperties::ChangeOp( |
| 669 common()->Phi(kMachInt32, value_input_count)); | 670 phi, |
| 671 common()->Phi(MachineRepresentation::kWord32, value_input_count)); |
| 670 return Replace(phi); | 672 return Replace(phi); |
| 671 } | 673 } |
| 672 } | 674 } |
| 673 return NoChange(); | 675 return NoChange(); |
| 674 } | 676 } |
| 675 | 677 |
| 676 | 678 |
| 677 Reduction MachineOperatorReducer::ReduceStore(Node* node) { | 679 Reduction MachineOperatorReducer::ReduceStore(Node* node) { |
| 678 MachineType const rep = | 680 MachineRepresentation const rep = |
| 679 RepresentationOf(StoreRepresentationOf(node->op()).machine_type()); | 681 StoreRepresentationOf(node->op()).machine_type().representation(); |
| 680 Node* const value = node->InputAt(2); | 682 Node* const value = node->InputAt(2); |
| 681 switch (value->opcode()) { | 683 switch (value->opcode()) { |
| 682 case IrOpcode::kWord32And: { | 684 case IrOpcode::kWord32And: { |
| 683 Uint32BinopMatcher m(value); | 685 Uint32BinopMatcher m(value); |
| 684 if (m.right().HasValue() && | 686 if (m.right().HasValue() && ((rep == MachineRepresentation::kWord8 && |
| 685 ((rep == kRepWord8 && (m.right().Value() & 0xff) == 0xff) || | 687 (m.right().Value() & 0xff) == 0xff) || |
| 686 (rep == kRepWord16 && (m.right().Value() & 0xffff) == 0xffff))) { | 688 (rep == MachineRepresentation::kWord16 && |
| 689 (m.right().Value() & 0xffff) == 0xffff))) { |
| 687 node->ReplaceInput(2, m.left().node()); | 690 node->ReplaceInput(2, m.left().node()); |
| 688 return Changed(node); | 691 return Changed(node); |
| 689 } | 692 } |
| 690 break; | 693 break; |
| 691 } | 694 } |
| 692 case IrOpcode::kWord32Sar: { | 695 case IrOpcode::kWord32Sar: { |
| 693 Int32BinopMatcher m(value); | 696 Int32BinopMatcher m(value); |
| 694 if (m.left().IsWord32Shl() && | 697 if (m.left().IsWord32Shl() && ((rep == MachineRepresentation::kWord8 && |
| 695 ((rep == kRepWord8 && m.right().IsInRange(1, 24)) || | 698 m.right().IsInRange(1, 24)) || |
| 696 (rep == kRepWord16 && m.right().IsInRange(1, 16)))) { | 699 (rep == MachineRepresentation::kWord16 && |
| 700 m.right().IsInRange(1, 16)))) { |
| 697 Int32BinopMatcher mleft(m.left().node()); | 701 Int32BinopMatcher mleft(m.left().node()); |
| 698 if (mleft.right().Is(m.right().Value())) { | 702 if (mleft.right().Is(m.right().Value())) { |
| 699 node->ReplaceInput(2, mleft.left().node()); | 703 node->ReplaceInput(2, mleft.left().node()); |
| 700 return Changed(node); | 704 return Changed(node); |
| 701 } | 705 } |
| 702 } | 706 } |
| 703 break; | 707 break; |
| 704 } | 708 } |
| 705 default: | 709 default: |
| 706 break; | 710 break; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 if (m.right().Is(31) && mleft.right().Is(31)) { | 808 if (m.right().Is(31) && mleft.right().Is(31)) { |
| 805 // Comparison << 31 >> 31 => 0 - Comparison | 809 // Comparison << 31 >> 31 => 0 - Comparison |
| 806 node->ReplaceInput(0, Int32Constant(0)); | 810 node->ReplaceInput(0, Int32Constant(0)); |
| 807 node->ReplaceInput(1, mleft.left().node()); | 811 node->ReplaceInput(1, mleft.left().node()); |
| 808 NodeProperties::ChangeOp(node, machine()->Int32Sub()); | 812 NodeProperties::ChangeOp(node, machine()->Int32Sub()); |
| 809 Reduction const reduction = ReduceInt32Sub(node); | 813 Reduction const reduction = ReduceInt32Sub(node); |
| 810 return reduction.Changed() ? reduction : Changed(node); | 814 return reduction.Changed() ? reduction : Changed(node); |
| 811 } | 815 } |
| 812 } else if (mleft.left().IsLoad()) { | 816 } else if (mleft.left().IsLoad()) { |
| 813 LoadRepresentation const rep = | 817 LoadRepresentation const rep = |
| 814 OpParameter<LoadRepresentation>(mleft.left().node()); | 818 LoadRepresentationOf(mleft.left().node()->op()); |
| 815 if (m.right().Is(24) && mleft.right().Is(24) && rep == kMachInt8) { | 819 if (m.right().Is(24) && mleft.right().Is(24) && |
| 820 rep == MachineType::Int8()) { |
| 816 // Load[kMachInt8] << 24 >> 24 => Load[kMachInt8] | 821 // Load[kMachInt8] << 24 >> 24 => Load[kMachInt8] |
| 817 return Replace(mleft.left().node()); | 822 return Replace(mleft.left().node()); |
| 818 } | 823 } |
| 819 if (m.right().Is(16) && mleft.right().Is(16) && rep == kMachInt16) { | 824 if (m.right().Is(16) && mleft.right().Is(16) && |
| 825 rep == MachineType::Int16()) { |
| 820 // Load[kMachInt16] << 16 >> 16 => Load[kMachInt8] | 826 // Load[kMachInt16] << 16 >> 16 => Load[kMachInt8] |
| 821 return Replace(mleft.left().node()); | 827 return Replace(mleft.left().node()); |
| 822 } | 828 } |
| 823 } | 829 } |
| 824 } | 830 } |
| 825 return ReduceWord32Shifts(node); | 831 return ReduceWord32Shifts(node); |
| 826 } | 832 } |
| 827 | 833 |
| 828 | 834 |
| 829 Reduction MachineOperatorReducer::ReduceWord32And(Node* node) { | 835 Reduction MachineOperatorReducer::ReduceWord32And(Node* node) { |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1076 MachineOperatorBuilder* MachineOperatorReducer::machine() const { | 1082 MachineOperatorBuilder* MachineOperatorReducer::machine() const { |
| 1077 return jsgraph()->machine(); | 1083 return jsgraph()->machine(); |
| 1078 } | 1084 } |
| 1079 | 1085 |
| 1080 | 1086 |
| 1081 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } | 1087 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } |
| 1082 | 1088 |
| 1083 } // namespace compiler | 1089 } // namespace compiler |
| 1084 } // namespace internal | 1090 } // namespace internal |
| 1085 } // namespace v8 | 1091 } // namespace v8 |
| OLD | NEW |