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

Side by Side Diff: src/compiler/machine-operator-reducer.cc

Issue 847113002: [turbofan] Reduce Word32And masking with shifted inputs. (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 | « no previous file | test/unittests/compiler/machine-operator-reducer-unittest.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/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 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 if (m.left().IsWord32And() && m.right().HasValue()) { 796 if (m.left().IsWord32And() && m.right().HasValue()) {
797 Int32BinopMatcher mleft(m.left().node()); 797 Int32BinopMatcher mleft(m.left().node());
798 if (mleft.right().HasValue()) { // (x & K) & K => x & K 798 if (mleft.right().HasValue()) { // (x & K) & K => x & K
799 node->ReplaceInput(0, mleft.left().node()); 799 node->ReplaceInput(0, mleft.left().node());
800 node->ReplaceInput( 800 node->ReplaceInput(
801 1, Int32Constant(m.right().Value() & mleft.right().Value())); 801 1, Int32Constant(m.right().Value() & mleft.right().Value()));
802 Reduction const reduction = ReduceWord32And(node); 802 Reduction const reduction = ReduceWord32And(node);
803 return reduction.Changed() ? reduction : Changed(node); 803 return reduction.Changed() ? reduction : Changed(node);
804 } 804 }
805 } 805 }
806 if (m.left().IsInt32Add() && m.right().IsNegativePowerOf2()) { 806 if (m.right().IsNegativePowerOf2()) {
807 Int32BinopMatcher mleft(m.left().node()); 807 int32_t const mask = m.right().Value();
808 if (mleft.right().HasValue() && 808 if (m.left().IsWord32Shl()) {
809 (mleft.right().Value() & m.right().Value()) == mleft.right().Value()) { 809 Uint32BinopMatcher mleft(m.left().node());
810 // (x + (K << L)) & (-1 << L) => (x & (-1 << L)) + (K << L) 810 if (mleft.right().HasValue() &&
811 node->set_op(machine()->Int32Add()); 811 mleft.right().Value() >= base::bits::CountTrailingZeros32(mask)) {
812 node->ReplaceInput(0, Word32And(mleft.left().node(), m.right().node())); 812 // (x << L) & (-1 << K) => x << L iff K >= L
813 node->ReplaceInput(1, mleft.right().node()); 813 return Replace(mleft.node());
814 Reduction const reduction = ReduceInt32Add(node); 814 }
815 return reduction.Changed() ? reduction : Changed(node); 815 } else if (m.left().IsInt32Add()) {
816 } 816 Int32BinopMatcher mleft(m.left().node());
817 if (mleft.left().IsInt32Mul()) { 817 if (mleft.right().HasValue() &&
818 Int32BinopMatcher mleftleft(mleft.left().node()); 818 (mleft.right().Value() & mask) == mleft.right().Value()) {
819 if (mleftleft.right().IsMultipleOf(-m.right().Value())) { 819 // (x + (K << L)) & (-1 << L) => (x & (-1 << L)) + (K << L)
820 // (y * (K << L) + x) & (-1 << L) => (x & (-1 << L)) + y * (K << L)
821 node->set_op(machine()->Int32Add()); 820 node->set_op(machine()->Int32Add());
822 node->ReplaceInput(0, 821 node->ReplaceInput(0, Word32And(mleft.left().node(), m.right().node()));
823 Word32And(mleft.right().node(), m.right().node())); 822 node->ReplaceInput(1, mleft.right().node());
824 node->ReplaceInput(1, mleftleft.node());
825 Reduction const reduction = ReduceInt32Add(node); 823 Reduction const reduction = ReduceInt32Add(node);
826 return reduction.Changed() ? reduction : Changed(node); 824 return reduction.Changed() ? reduction : Changed(node);
827 } 825 }
828 } 826 if (mleft.left().IsInt32Mul()) {
829 if (mleft.right().IsInt32Mul()) { 827 Int32BinopMatcher mleftleft(mleft.left().node());
830 Int32BinopMatcher mleftright(mleft.right().node()); 828 if (mleftleft.right().IsMultipleOf(-mask)) {
831 if (mleftright.right().IsMultipleOf(-m.right().Value())) { 829 // (y * (K << L) + x) & (-1 << L) => (x & (-1 << L)) + y * (K << L)
832 // (x + y * (K << L)) & (-1 << L) => (x & (-1 << L)) + y * (K << L) 830 node->set_op(machine()->Int32Add());
833 node->set_op(machine()->Int32Add()); 831 node->ReplaceInput(0,
834 node->ReplaceInput(0, Word32And(mleft.left().node(), m.right().node())); 832 Word32And(mleft.right().node(), m.right().node()));
835 node->ReplaceInput(1, mleftright.node()); 833 node->ReplaceInput(1, mleftleft.node());
836 Reduction const reduction = ReduceInt32Add(node); 834 Reduction const reduction = ReduceInt32Add(node);
837 return reduction.Changed() ? reduction : Changed(node); 835 return reduction.Changed() ? reduction : Changed(node);
836 }
838 } 837 }
839 } 838 if (mleft.right().IsInt32Mul()) {
840 if (mleft.left().IsWord32Shl()) { 839 Int32BinopMatcher mleftright(mleft.right().node());
841 Int32BinopMatcher mleftleft(mleft.left().node()); 840 if (mleftright.right().IsMultipleOf(-mask)) {
842 if (mleftleft.right().Is( 841 // (x + y * (K << L)) & (-1 << L) => (x & (-1 << L)) + y * (K << L)
843 base::bits::CountTrailingZeros32(m.right().Value()))) { 842 node->set_op(machine()->Int32Add());
844 // (y << L + x) & (-1 << L) => (x & (-1 << L)) + y << L 843 node->ReplaceInput(0,
845 node->set_op(machine()->Int32Add()); 844 Word32And(mleft.left().node(), m.right().node()));
846 node->ReplaceInput(0, 845 node->ReplaceInput(1, mleftright.node());
847 Word32And(mleft.right().node(), m.right().node())); 846 Reduction const reduction = ReduceInt32Add(node);
848 node->ReplaceInput(1, mleftleft.node()); 847 return reduction.Changed() ? reduction : Changed(node);
849 Reduction const reduction = ReduceInt32Add(node); 848 }
850 return reduction.Changed() ? reduction : Changed(node);
851 } 849 }
852 } 850 if (mleft.left().IsWord32Shl()) {
853 if (mleft.right().IsWord32Shl()) { 851 Int32BinopMatcher mleftleft(mleft.left().node());
854 Int32BinopMatcher mleftright(mleft.right().node()); 852 if (mleftleft.right().Is(base::bits::CountTrailingZeros32(mask))) {
855 if (mleftright.right().Is( 853 // (y << L + x) & (-1 << L) => (x & (-1 << L)) + y << L
856 base::bits::CountTrailingZeros32(m.right().Value()))) { 854 node->set_op(machine()->Int32Add());
857 // (x + y << L) & (-1 << L) => (x & (-1 << L)) + y << L 855 node->ReplaceInput(0,
858 node->set_op(machine()->Int32Add()); 856 Word32And(mleft.right().node(), m.right().node()));
859 node->ReplaceInput(0, Word32And(mleft.left().node(), m.right().node())); 857 node->ReplaceInput(1, mleftleft.node());
860 node->ReplaceInput(1, mleftright.node()); 858 Reduction const reduction = ReduceInt32Add(node);
861 Reduction const reduction = ReduceInt32Add(node); 859 return reduction.Changed() ? reduction : Changed(node);
862 return reduction.Changed() ? reduction : Changed(node); 860 }
861 }
862 if (mleft.right().IsWord32Shl()) {
863 Int32BinopMatcher mleftright(mleft.right().node());
864 if (mleftright.right().Is(base::bits::CountTrailingZeros32(mask))) {
865 // (x + y << L) & (-1 << L) => (x & (-1 << L)) + y << L
866 node->set_op(machine()->Int32Add());
867 node->ReplaceInput(0,
868 Word32And(mleft.left().node(), m.right().node()));
869 node->ReplaceInput(1, mleftright.node());
870 Reduction const reduction = ReduceInt32Add(node);
871 return reduction.Changed() ? reduction : Changed(node);
872 }
863 } 873 }
864 } 874 }
865 } 875 }
866 return NoChange(); 876 return NoChange();
867 } 877 }
868 878
869 879
870 Reduction MachineOperatorReducer::ReduceWord32Or(Node* node) { 880 Reduction MachineOperatorReducer::ReduceWord32Or(Node* node) {
871 DCHECK_EQ(IrOpcode::kWord32Or, node->opcode()); 881 DCHECK_EQ(IrOpcode::kWord32Or, node->opcode());
872 Int32BinopMatcher m(node); 882 Int32BinopMatcher m(node);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 MachineOperatorBuilder* MachineOperatorReducer::machine() const { 942 MachineOperatorBuilder* MachineOperatorReducer::machine() const {
933 return jsgraph()->machine(); 943 return jsgraph()->machine();
934 } 944 }
935 945
936 946
937 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } 947 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); }
938 948
939 } // namespace compiler 949 } // namespace compiler
940 } // namespace internal 950 } // namespace internal
941 } // namespace v8 951 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/unittests/compiler/machine-operator-reducer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698