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

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

Issue 684193002: [turbofan] Fix input count in Uint32Mod/Div reduction. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Change order of node transformation. Created 6 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/compiler/machine-operator-reducer.cc ('k') | 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 "test/cctest/cctest.h" 5 #include "test/cctest/cctest.h"
6 6
7 #include "src/base/utils/random-number-generator.h" 7 #include "src/base/utils/random-number-generator.h"
8 #include "src/codegen.h" 8 #include "src/codegen.h"
9 #include "src/compiler/graph-inl.h" 9 #include "src/compiler/graph-inl.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
11 #include "src/compiler/machine-operator-reducer.h" 11 #include "src/compiler/machine-operator-reducer.h"
12 #include "src/compiler/operator-properties.h"
13 #include "src/compiler/operator-properties-inl.h"
12 #include "src/compiler/typer.h" 14 #include "src/compiler/typer.h"
13 #include "test/cctest/compiler/value-helper.h" 15 #include "test/cctest/compiler/value-helper.h"
14 16
15 using namespace v8::internal; 17 using namespace v8::internal;
16 using namespace v8::internal::compiler; 18 using namespace v8::internal::compiler;
17 19
18 template <typename T> 20 template <typename T>
19 const Operator* NewConstantOperator(CommonOperatorBuilder* common, 21 const Operator* NewConstantOperator(CommonOperatorBuilder* common,
20 volatile T value); 22 volatile T value);
21 23
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 template <typename T> 92 template <typename T>
91 void CheckFoldBinop(volatile T expect, volatile T a, volatile T b) { 93 void CheckFoldBinop(volatile T expect, volatile T a, volatile T b) {
92 CheckFoldBinop<T>(expect, Constant<T>(a), Constant<T>(b)); 94 CheckFoldBinop<T>(expect, Constant<T>(a), Constant<T>(b));
93 } 95 }
94 96
95 // Check that the reduction of this binop applied to {a} and {b} yields 97 // Check that the reduction of this binop applied to {a} and {b} yields
96 // the {expect} value. 98 // the {expect} value.
97 template <typename T> 99 template <typename T>
98 void CheckFoldBinop(volatile T expect, Node* a, Node* b) { 100 void CheckFoldBinop(volatile T expect, Node* a, Node* b) {
99 CHECK_NE(NULL, binop); 101 CHECK_NE(NULL, binop);
100 Node* n = graph.NewNode(binop, a, b); 102 Node* n = CreateBinopNode(a, b);
101 MachineOperatorReducer reducer(&jsgraph); 103 MachineOperatorReducer reducer(&jsgraph);
102 Reduction reduction = reducer.Reduce(n); 104 Reduction reduction = reducer.Reduce(n);
103 CHECK(reduction.Changed()); 105 CHECK(reduction.Changed());
104 CHECK_NE(n, reduction.replacement()); 106 CHECK_NE(n, reduction.replacement());
105 CHECK_EQ(expect, ValueOf<T>(reduction.replacement()->op())); 107 CHECK_EQ(expect, ValueOf<T>(reduction.replacement()->op()));
106 } 108 }
107 109
108 // Check that the reduction of this binop applied to {a} and {b} yields 110 // Check that the reduction of this binop applied to {a} and {b} yields
109 // the {expect} node. 111 // the {expect} node.
110 void CheckBinop(Node* expect, Node* a, Node* b) { 112 void CheckBinop(Node* expect, Node* a, Node* b) {
111 CHECK_NE(NULL, binop); 113 CHECK_NE(NULL, binop);
112 Node* n = graph.NewNode(binop, a, b); 114 Node* n = CreateBinopNode(a, b);
113 MachineOperatorReducer reducer(&jsgraph); 115 MachineOperatorReducer reducer(&jsgraph);
114 Reduction reduction = reducer.Reduce(n); 116 Reduction reduction = reducer.Reduce(n);
115 CHECK(reduction.Changed()); 117 CHECK(reduction.Changed());
116 CHECK_EQ(expect, reduction.replacement()); 118 CHECK_EQ(expect, reduction.replacement());
117 } 119 }
118 120
119 // Check that the reduction of this binop applied to {left} and {right} yields 121 // Check that the reduction of this binop applied to {left} and {right} yields
120 // this binop applied to {left_expect} and {right_expect}. 122 // this binop applied to {left_expect} and {right_expect}.
121 void CheckFoldBinop(Node* left_expect, Node* right_expect, Node* left, 123 void CheckFoldBinop(Node* left_expect, Node* right_expect, Node* left,
122 Node* right) { 124 Node* right) {
123 CHECK_NE(NULL, binop); 125 CHECK_NE(NULL, binop);
124 Node* n = graph.NewNode(binop, left, right); 126 Node* n = CreateBinopNode(left, right);
125 MachineOperatorReducer reducer(&jsgraph); 127 MachineOperatorReducer reducer(&jsgraph);
126 Reduction reduction = reducer.Reduce(n); 128 Reduction reduction = reducer.Reduce(n);
127 CHECK(reduction.Changed()); 129 CHECK(reduction.Changed());
128 CHECK_EQ(binop, reduction.replacement()->op()); 130 CHECK_EQ(binop, reduction.replacement()->op());
129 CHECK_EQ(left_expect, reduction.replacement()->InputAt(0)); 131 CHECK_EQ(left_expect, reduction.replacement()->InputAt(0));
130 CHECK_EQ(right_expect, reduction.replacement()->InputAt(1)); 132 CHECK_EQ(right_expect, reduction.replacement()->InputAt(1));
131 } 133 }
132 134
133 // Check that the reduction of this binop applied to {left} and {right} yields 135 // Check that the reduction of this binop applied to {left} and {right} yields
134 // the {op_expect} applied to {left_expect} and {right_expect}. 136 // the {op_expect} applied to {left_expect} and {right_expect}.
135 template <typename T> 137 template <typename T>
136 void CheckFoldBinop(volatile T left_expect, const Operator* op_expect, 138 void CheckFoldBinop(volatile T left_expect, const Operator* op_expect,
137 Node* right_expect, Node* left, Node* right) { 139 Node* right_expect, Node* left, Node* right) {
138 CHECK_NE(NULL, binop); 140 CHECK_NE(NULL, binop);
139 Node* n = graph.NewNode(binop, left, right); 141 Node* n = CreateBinopNode(left, right);
140 MachineOperatorReducer reducer(&jsgraph); 142 MachineOperatorReducer reducer(&jsgraph);
141 Reduction r = reducer.Reduce(n); 143 Reduction r = reducer.Reduce(n);
142 CHECK(r.Changed()); 144 CHECK(r.Changed());
143 CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode()); 145 CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode());
144 CHECK_EQ(left_expect, ValueOf<T>(r.replacement()->InputAt(0)->op())); 146 CHECK_EQ(left_expect, ValueOf<T>(r.replacement()->InputAt(0)->op()));
145 CHECK_EQ(right_expect, r.replacement()->InputAt(1)); 147 CHECK_EQ(right_expect, r.replacement()->InputAt(1));
146 } 148 }
147 149
148 // Check that the reduction of this binop applied to {left} and {right} yields 150 // Check that the reduction of this binop applied to {left} and {right} yields
149 // the {op_expect} applied to {left_expect} and {right_expect}. 151 // the {op_expect} applied to {left_expect} and {right_expect}.
150 template <typename T> 152 template <typename T>
151 void CheckFoldBinop(Node* left_expect, const Operator* op_expect, 153 void CheckFoldBinop(Node* left_expect, const Operator* op_expect,
152 volatile T right_expect, Node* left, Node* right) { 154 volatile T right_expect, Node* left, Node* right) {
153 CHECK_NE(NULL, binop); 155 CHECK_NE(NULL, binop);
154 Node* n = graph.NewNode(binop, left, right); 156 Node* n = CreateBinopNode(left, right);
155 MachineOperatorReducer reducer(&jsgraph); 157 MachineOperatorReducer reducer(&jsgraph);
156 Reduction r = reducer.Reduce(n); 158 Reduction r = reducer.Reduce(n);
157 CHECK(r.Changed()); 159 CHECK(r.Changed());
158 CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode()); 160 CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode());
161 CHECK_EQ(OperatorProperties::GetTotalInputCount(op_expect),
162 r.replacement()->InputCount());
159 CHECK_EQ(left_expect, r.replacement()->InputAt(0)); 163 CHECK_EQ(left_expect, r.replacement()->InputAt(0));
160 CHECK_EQ(right_expect, ValueOf<T>(r.replacement()->InputAt(1)->op())); 164 CHECK_EQ(right_expect, ValueOf<T>(r.replacement()->InputAt(1)->op()));
161 } 165 }
162 166
163 // Check that if the given constant appears on the left, the reducer will 167 // Check that if the given constant appears on the left, the reducer will
164 // swap it to be on the right. 168 // swap it to be on the right.
165 template <typename T> 169 template <typename T>
166 void CheckPutConstantOnRight(volatile T constant) { 170 void CheckPutConstantOnRight(volatile T constant) {
167 // TODO(titzer): CHECK(binop->HasProperty(Operator::kCommutative)); 171 // TODO(titzer): CHECK(binop->HasProperty(Operator::kCommutative));
168 Node* p = Parameter(); 172 Node* p = Parameter();
169 Node* k = Constant<T>(constant); 173 Node* k = Constant<T>(constant);
170 { 174 {
171 Node* n = graph.NewNode(binop, k, p); 175 Node* n = CreateBinopNode(k, p);
172 MachineOperatorReducer reducer(&jsgraph); 176 MachineOperatorReducer reducer(&jsgraph);
173 Reduction reduction = reducer.Reduce(n); 177 Reduction reduction = reducer.Reduce(n);
174 CHECK(!reduction.Changed() || reduction.replacement() == n); 178 CHECK(!reduction.Changed() || reduction.replacement() == n);
175 CHECK_EQ(p, n->InputAt(0)); 179 CHECK_EQ(p, n->InputAt(0));
176 CHECK_EQ(k, n->InputAt(1)); 180 CHECK_EQ(k, n->InputAt(1));
177 } 181 }
178 { 182 {
179 Node* n = graph.NewNode(binop, p, k); 183 Node* n = CreateBinopNode(p, k);
180 MachineOperatorReducer reducer(&jsgraph); 184 MachineOperatorReducer reducer(&jsgraph);
181 Reduction reduction = reducer.Reduce(n); 185 Reduction reduction = reducer.Reduce(n);
182 CHECK(!reduction.Changed()); 186 CHECK(!reduction.Changed());
183 CHECK_EQ(p, n->InputAt(0)); 187 CHECK_EQ(p, n->InputAt(0));
184 CHECK_EQ(k, n->InputAt(1)); 188 CHECK_EQ(k, n->InputAt(1));
185 } 189 }
186 } 190 }
187 191
188 // Check that if the given constant appears on the left, the reducer will 192 // Check that if the given constant appears on the left, the reducer will
189 // *NOT* swap it to be on the right. 193 // *NOT* swap it to be on the right.
190 template <typename T> 194 template <typename T>
191 void CheckDontPutConstantOnRight(volatile T constant) { 195 void CheckDontPutConstantOnRight(volatile T constant) {
192 CHECK(!binop->HasProperty(Operator::kCommutative)); 196 CHECK(!binop->HasProperty(Operator::kCommutative));
193 Node* p = Parameter(); 197 Node* p = Parameter();
194 Node* k = Constant<T>(constant); 198 Node* k = Constant<T>(constant);
195 Node* n = graph.NewNode(binop, k, p); 199 Node* n = CreateBinopNode(k, p);
196 MachineOperatorReducer reducer(&jsgraph); 200 MachineOperatorReducer reducer(&jsgraph);
197 Reduction reduction = reducer.Reduce(n); 201 Reduction reduction = reducer.Reduce(n);
198 CHECK(!reduction.Changed()); 202 CHECK(!reduction.Changed());
199 CHECK_EQ(k, n->InputAt(0)); 203 CHECK_EQ(k, n->InputAt(0));
200 CHECK_EQ(p, n->InputAt(1)); 204 CHECK_EQ(p, n->InputAt(1));
201 } 205 }
202 206
203 Node* Parameter(int32_t index = 0) { 207 Node* Parameter(int32_t index = 0) {
204 return graph.NewNode(common.Parameter(index), graph.start()); 208 return graph.NewNode(common.Parameter(index), graph.start());
205 } 209 }
210
211 private:
212 Node* CreateBinopNode(Node* left, Node* right) {
213 if (binop->ControlInputCount() > 0) {
214 return graph.NewNode(binop, left, right, graph.start());
215 } else {
216 return graph.NewNode(binop, left, right);
217 }
218 }
206 }; 219 };
207 220
208 221
209 TEST(ReduceWord32And) { 222 TEST(ReduceWord32And) {
210 ReducerTester R; 223 ReducerTester R;
211 R.binop = R.machine.Word32And(); 224 R.binop = R.machine.Word32And();
212 225
213 FOR_INT32_INPUTS(pl) { 226 FOR_INT32_INPUTS(pl) {
214 FOR_INT32_INPUTS(pr) { 227 FOR_INT32_INPUTS(pr) {
215 int32_t x = *pl, y = *pr; 228 int32_t x = *pl, y = *pr;
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 // TODO(titzer): test MachineOperatorReducer for Int64Mul 832 // TODO(titzer): test MachineOperatorReducer for Int64Mul
820 // TODO(titzer): test MachineOperatorReducer for Int64UMul 833 // TODO(titzer): test MachineOperatorReducer for Int64UMul
821 // TODO(titzer): test MachineOperatorReducer for Int64Div 834 // TODO(titzer): test MachineOperatorReducer for Int64Div
822 // TODO(titzer): test MachineOperatorReducer for Uint64Div 835 // TODO(titzer): test MachineOperatorReducer for Uint64Div
823 // TODO(titzer): test MachineOperatorReducer for Int64Mod 836 // TODO(titzer): test MachineOperatorReducer for Int64Mod
824 // TODO(titzer): test MachineOperatorReducer for Uint64Mod 837 // TODO(titzer): test MachineOperatorReducer for Uint64Mod
825 // TODO(titzer): test MachineOperatorReducer for Int64Neg 838 // TODO(titzer): test MachineOperatorReducer for Int64Neg
826 // TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64 839 // TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64
827 // TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32 840 // TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32
828 // TODO(titzer): test MachineOperatorReducer for Float64Compare 841 // TODO(titzer): test MachineOperatorReducer for Float64Compare
OLDNEW
« no previous file with comments | « src/compiler/machine-operator-reducer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698