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

Side by Side Diff: test/cctest/compiler/test-simplified-lowering.cc

Issue 1513543003: [turbofan] Make MachineType a pair of enums. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Moar rebase Created 5 years 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
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 <limits> 5 #include <limits>
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/compiler/access-builder.h" 8 #include "src/compiler/access-builder.h"
9 #include "src/compiler/change-lowering.h" 9 #include "src/compiler/change-lowering.h"
10 #include "src/compiler/control-builders.h" 10 #include "src/compiler/control-builders.h"
(...skipping 15 matching lines...) Expand all
26 #include "test/cctest/compiler/graph-builder-tester.h" 26 #include "test/cctest/compiler/graph-builder-tester.h"
27 #include "test/cctest/compiler/value-helper.h" 27 #include "test/cctest/compiler/value-helper.h"
28 28
29 namespace v8 { 29 namespace v8 {
30 namespace internal { 30 namespace internal {
31 namespace compiler { 31 namespace compiler {
32 32
33 template <typename ReturnType> 33 template <typename ReturnType>
34 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { 34 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> {
35 public: 35 public:
36 SimplifiedLoweringTester(MachineType p0 = kMachNone, 36 SimplifiedLoweringTester(MachineType p0 = MachineType::None(),
37 MachineType p1 = kMachNone) 37 MachineType p1 = MachineType::None())
38 : GraphBuilderTester<ReturnType>(p0, p1), 38 : GraphBuilderTester<ReturnType>(p0, p1),
39 typer(this->isolate(), this->graph()), 39 typer(this->isolate(), this->graph()),
40 javascript(this->zone()), 40 javascript(this->zone()),
41 jsgraph(this->isolate(), this->graph(), this->common(), &javascript, 41 jsgraph(this->isolate(), this->graph(), this->common(), &javascript,
42 this->simplified(), this->machine()), 42 this->simplified(), this->machine()),
43 source_positions(jsgraph.graph()), 43 source_positions(jsgraph.graph()),
44 lowering(&jsgraph, this->zone(), &source_positions) {} 44 lowering(&jsgraph, this->zone(), &source_positions) {}
45 45
46 Typer typer; 46 Typer typer;
47 JSOperatorBuilder javascript; 47 JSOperatorBuilder javascript;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 93
94 94
95 // TODO(titzer): factor these tests out to test-run-simplifiedops.cc. 95 // TODO(titzer): factor these tests out to test-run-simplifiedops.cc.
96 // TODO(titzer): test tagged representation for input to NumberToInt32. 96 // TODO(titzer): test tagged representation for input to NumberToInt32.
97 TEST(RunNumberToInt32_float64) { 97 TEST(RunNumberToInt32_float64) {
98 // TODO(titzer): explicit load/stores here are only because of representations 98 // TODO(titzer): explicit load/stores here are only because of representations
99 double input; 99 double input;
100 int32_t result; 100 int32_t result;
101 SimplifiedLoweringTester<Object*> t; 101 SimplifiedLoweringTester<Object*> t;
102 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), 102 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(),
103 kMachFloat64}; 103 MachineType::Float64()};
104 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); 104 Node* loaded = t.LoadField(load, t.PointerConstant(&input));
105 NodeProperties::SetType(loaded, Type::Number()); 105 NodeProperties::SetType(loaded, Type::Number());
106 Node* convert = t.NumberToInt32(loaded); 106 Node* convert = t.NumberToInt32(loaded);
107 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Signed32(), 107 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Signed32(),
108 kMachInt32}; 108 MachineType::Int32()};
109 t.StoreField(store, t.PointerConstant(&result), convert); 109 t.StoreField(store, t.PointerConstant(&result), convert);
110 t.Return(t.jsgraph.TrueConstant()); 110 t.Return(t.jsgraph.TrueConstant());
111 t.LowerAllNodesAndLowerChanges(); 111 t.LowerAllNodesAndLowerChanges();
112 t.GenerateCode(); 112 t.GenerateCode();
113 113
114 FOR_FLOAT64_INPUTS(i) { 114 FOR_FLOAT64_INPUTS(i) {
115 input = *i; 115 input = *i;
116 int32_t expected = DoubleToInt32(*i); 116 int32_t expected = DoubleToInt32(*i);
117 t.Call(); 117 t.Call();
118 CHECK_EQ(expected, result); 118 CHECK_EQ(expected, result);
119 } 119 }
120 } 120 }
121 121
122 122
123 // TODO(titzer): test tagged representation for input to NumberToUint32. 123 // TODO(titzer): test tagged representation for input to NumberToUint32.
124 TEST(RunNumberToUint32_float64) { 124 TEST(RunNumberToUint32_float64) {
125 // TODO(titzer): explicit load/stores here are only because of representations 125 // TODO(titzer): explicit load/stores here are only because of representations
126 double input; 126 double input;
127 uint32_t result; 127 uint32_t result;
128 SimplifiedLoweringTester<Object*> t; 128 SimplifiedLoweringTester<Object*> t;
129 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), 129 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(),
130 kMachFloat64}; 130 MachineType::Float64()};
131 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); 131 Node* loaded = t.LoadField(load, t.PointerConstant(&input));
132 NodeProperties::SetType(loaded, Type::Number()); 132 NodeProperties::SetType(loaded, Type::Number());
133 Node* convert = t.NumberToUint32(loaded); 133 Node* convert = t.NumberToUint32(loaded);
134 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Unsigned32(), 134 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Unsigned32(),
135 kMachUint32}; 135 MachineType::Uint32()};
136 t.StoreField(store, t.PointerConstant(&result), convert); 136 t.StoreField(store, t.PointerConstant(&result), convert);
137 t.Return(t.jsgraph.TrueConstant()); 137 t.Return(t.jsgraph.TrueConstant());
138 t.LowerAllNodesAndLowerChanges(); 138 t.LowerAllNodesAndLowerChanges();
139 t.GenerateCode(); 139 t.GenerateCode();
140 140
141 FOR_FLOAT64_INPUTS(i) { 141 FOR_FLOAT64_INPUTS(i) {
142 input = *i; 142 input = *i;
143 uint32_t expected = DoubleToUint32(*i); 143 uint32_t expected = DoubleToUint32(*i);
144 t.Call(); 144 t.Call();
145 CHECK_EQ(static_cast<int32_t>(expected), static_cast<int32_t>(result)); 145 CHECK_EQ(static_cast<int32_t>(expected), static_cast<int32_t>(result));
146 } 146 }
147 } 147 }
148 148
149 149
150 // Create a simple JSObject with a unique map. 150 // Create a simple JSObject with a unique map.
151 static Handle<JSObject> TestObject() { 151 static Handle<JSObject> TestObject() {
152 static int index = 0; 152 static int index = 0;
153 char buffer[50]; 153 char buffer[50];
154 v8::base::OS::SNPrintF(buffer, 50, "({'a_%d':1})", index++); 154 v8::base::OS::SNPrintF(buffer, 50, "({'a_%d':1})", index++);
155 return Handle<JSObject>::cast(v8::Utils::OpenHandle(*CompileRun(buffer))); 155 return Handle<JSObject>::cast(v8::Utils::OpenHandle(*CompileRun(buffer)));
156 } 156 }
157 157
158 158
159 TEST(RunLoadMap) { 159 TEST(RunLoadMap) {
160 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 160 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
161 FieldAccess access = AccessBuilder::ForMap(); 161 FieldAccess access = AccessBuilder::ForMap();
162 Node* load = t.LoadField(access, t.Parameter(0)); 162 Node* load = t.LoadField(access, t.Parameter(0));
163 t.Return(load); 163 t.Return(load);
164 164
165 t.LowerAllNodesAndLowerChanges(); 165 t.LowerAllNodesAndLowerChanges();
166 t.GenerateCode(); 166 t.GenerateCode();
167 167
168 Handle<JSObject> src = TestObject(); 168 Handle<JSObject> src = TestObject();
169 Handle<Map> src_map(src->map()); 169 Handle<Map> src_map(src->map());
170 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call 170 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call
171 CHECK_EQ(*src_map, result); 171 CHECK_EQ(*src_map, result);
172 } 172 }
173 173
174 174
175 TEST(RunStoreMap) { 175 TEST(RunStoreMap) {
176 SimplifiedLoweringTester<int32_t> t(kMachAnyTagged, kMachAnyTagged); 176 SimplifiedLoweringTester<int32_t> t(MachineType::AnyTagged(),
177 MachineType::AnyTagged());
177 FieldAccess access = AccessBuilder::ForMap(); 178 FieldAccess access = AccessBuilder::ForMap();
178 t.StoreField(access, t.Parameter(1), t.Parameter(0)); 179 t.StoreField(access, t.Parameter(1), t.Parameter(0));
179 t.Return(t.jsgraph.TrueConstant()); 180 t.Return(t.jsgraph.TrueConstant());
180 181
181 t.LowerAllNodesAndLowerChanges(); 182 t.LowerAllNodesAndLowerChanges();
182 t.GenerateCode(); 183 t.GenerateCode();
183 184
184 Handle<JSObject> src = TestObject(); 185 Handle<JSObject> src = TestObject();
185 Handle<Map> src_map(src->map()); 186 Handle<Map> src_map(src->map());
186 Handle<JSObject> dst = TestObject(); 187 Handle<JSObject> dst = TestObject();
187 CHECK(src->map() != dst->map()); 188 CHECK(src->map() != dst->map());
188 t.Call(*src_map, *dst); // TODO(titzer): raw pointers in call 189 t.Call(*src_map, *dst); // TODO(titzer): raw pointers in call
189 CHECK(*src_map == dst->map()); 190 CHECK(*src_map == dst->map());
190 } 191 }
191 192
192 193
193 TEST(RunLoadProperties) { 194 TEST(RunLoadProperties) {
194 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 195 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
195 FieldAccess access = AccessBuilder::ForJSObjectProperties(); 196 FieldAccess access = AccessBuilder::ForJSObjectProperties();
196 Node* load = t.LoadField(access, t.Parameter(0)); 197 Node* load = t.LoadField(access, t.Parameter(0));
197 t.Return(load); 198 t.Return(load);
198 199
199 t.LowerAllNodesAndLowerChanges(); 200 t.LowerAllNodesAndLowerChanges();
200 t.GenerateCode(); 201 t.GenerateCode();
201 202
202 Handle<JSObject> src = TestObject(); 203 Handle<JSObject> src = TestObject();
203 Handle<FixedArray> src_props(src->properties()); 204 Handle<FixedArray> src_props(src->properties());
204 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call 205 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call
205 CHECK_EQ(*src_props, result); 206 CHECK_EQ(*src_props, result);
206 } 207 }
207 208
208 209
209 TEST(RunLoadStoreMap) { 210 TEST(RunLoadStoreMap) {
210 SimplifiedLoweringTester<Object*> t(kMachAnyTagged, kMachAnyTagged); 211 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged(),
212 MachineType::AnyTagged());
211 FieldAccess access = AccessBuilder::ForMap(); 213 FieldAccess access = AccessBuilder::ForMap();
212 Node* load = t.LoadField(access, t.Parameter(0)); 214 Node* load = t.LoadField(access, t.Parameter(0));
213 t.StoreField(access, t.Parameter(1), load); 215 t.StoreField(access, t.Parameter(1), load);
214 t.Return(load); 216 t.Return(load);
215 217
216 t.LowerAllNodesAndLowerChanges(); 218 t.LowerAllNodesAndLowerChanges();
217 t.GenerateCode(); 219 t.GenerateCode();
218 220
219 Handle<JSObject> src = TestObject(); 221 Handle<JSObject> src = TestObject();
220 Handle<Map> src_map(src->map()); 222 Handle<Map> src_map(src->map());
221 Handle<JSObject> dst = TestObject(); 223 Handle<JSObject> dst = TestObject();
222 CHECK(src->map() != dst->map()); 224 CHECK(src->map() != dst->map());
223 Object* result = t.Call(*src, *dst); // TODO(titzer): raw pointers in call 225 Object* result = t.Call(*src, *dst); // TODO(titzer): raw pointers in call
224 CHECK(result->IsMap()); 226 CHECK(result->IsMap());
225 CHECK_EQ(*src_map, result); 227 CHECK_EQ(*src_map, result);
226 CHECK(*src_map == dst->map()); 228 CHECK(*src_map == dst->map());
227 } 229 }
228 230
229 231
230 TEST(RunLoadStoreFixedArrayIndex) { 232 TEST(RunLoadStoreFixedArrayIndex) {
231 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 233 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
232 ElementAccess access = AccessBuilder::ForFixedArrayElement(); 234 ElementAccess access = AccessBuilder::ForFixedArrayElement();
233 Node* load = t.LoadElement(access, t.Parameter(0), t.Int32Constant(0)); 235 Node* load = t.LoadElement(access, t.Parameter(0), t.Int32Constant(0));
234 t.StoreElement(access, t.Parameter(0), t.Int32Constant(1), load); 236 t.StoreElement(access, t.Parameter(0), t.Int32Constant(1), load);
235 t.Return(load); 237 t.Return(load);
236 238
237 t.LowerAllNodesAndLowerChanges(); 239 t.LowerAllNodesAndLowerChanges();
238 t.GenerateCode(); 240 t.GenerateCode();
239 241
240 Handle<FixedArray> array = t.factory()->NewFixedArray(2); 242 Handle<FixedArray> array = t.factory()->NewFixedArray(2);
241 Handle<JSObject> src = TestObject(); 243 Handle<JSObject> src = TestObject();
242 Handle<JSObject> dst = TestObject(); 244 Handle<JSObject> dst = TestObject();
243 array->set(0, *src); 245 array->set(0, *src);
244 array->set(1, *dst); 246 array->set(1, *dst);
245 Object* result = t.Call(*array); 247 Object* result = t.Call(*array);
246 CHECK_EQ(*src, result); 248 CHECK_EQ(*src, result);
247 CHECK_EQ(*src, array->get(0)); 249 CHECK_EQ(*src, array->get(0));
248 CHECK_EQ(*src, array->get(1)); 250 CHECK_EQ(*src, array->get(1));
249 } 251 }
250 252
251 253
252 TEST(RunLoadStoreArrayBuffer) { 254 TEST(RunLoadStoreArrayBuffer) {
253 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 255 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
254 const int index = 12; 256 const int index = 12;
255 const int array_length = 2 * index; 257 const int array_length = 2 * index;
256 ElementAccess buffer_access = 258 ElementAccess buffer_access =
257 AccessBuilder::ForTypedArrayElement(kExternalInt8Array, true); 259 AccessBuilder::ForTypedArrayElement(kExternalInt8Array, true);
258 Node* backing_store = t.LoadField( 260 Node* backing_store = t.LoadField(
259 AccessBuilder::ForJSArrayBufferBackingStore(), t.Parameter(0)); 261 AccessBuilder::ForJSArrayBufferBackingStore(), t.Parameter(0));
260 Node* load = 262 Node* load =
261 t.LoadElement(buffer_access, backing_store, t.Int32Constant(index)); 263 t.LoadElement(buffer_access, backing_store, t.Int32Constant(index));
262 t.StoreElement(buffer_access, backing_store, t.Int32Constant(index + 1), 264 t.StoreElement(buffer_access, backing_store, t.Int32Constant(index + 1),
263 load); 265 load);
(...skipping 19 matching lines...) Expand all
283 } 285 }
284 } 286 }
285 287
286 288
287 TEST(RunLoadFieldFromUntaggedBase) { 289 TEST(RunLoadFieldFromUntaggedBase) {
288 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; 290 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)};
289 291
290 for (size_t i = 0; i < arraysize(smis); i++) { 292 for (size_t i = 0; i < arraysize(smis); i++) {
291 int offset = static_cast<int>(i * sizeof(Smi*)); 293 int offset = static_cast<int>(i * sizeof(Smi*));
292 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(), 294 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(),
293 Type::Integral32(), kMachAnyTagged}; 295 Type::Integral32(), MachineType::AnyTagged()};
294 296
295 SimplifiedLoweringTester<Object*> t; 297 SimplifiedLoweringTester<Object*> t;
296 Node* load = t.LoadField(access, t.PointerConstant(smis)); 298 Node* load = t.LoadField(access, t.PointerConstant(smis));
297 t.Return(load); 299 t.Return(load);
298 t.LowerAllNodesAndLowerChanges(); 300 t.LowerAllNodesAndLowerChanges();
299 301
300 for (int j = -5; j <= 5; j++) { 302 for (int j = -5; j <= 5; j++) {
301 Smi* expected = Smi::FromInt(j); 303 Smi* expected = Smi::FromInt(j);
302 smis[i] = expected; 304 smis[i] = expected;
303 CHECK_EQ(expected, t.Call()); 305 CHECK_EQ(expected, t.Call());
304 } 306 }
305 } 307 }
306 } 308 }
307 309
308 310
309 TEST(RunStoreFieldToUntaggedBase) { 311 TEST(RunStoreFieldToUntaggedBase) {
310 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; 312 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)};
311 313
312 for (size_t i = 0; i < arraysize(smis); i++) { 314 for (size_t i = 0; i < arraysize(smis); i++) {
313 int offset = static_cast<int>(i * sizeof(Smi*)); 315 int offset = static_cast<int>(i * sizeof(Smi*));
314 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(), 316 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(),
315 Type::Integral32(), kMachAnyTagged}; 317 Type::Integral32(), MachineType::AnyTagged()};
316 318
317 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 319 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
318 Node* p0 = t.Parameter(0); 320 Node* p0 = t.Parameter(0);
319 t.StoreField(access, t.PointerConstant(smis), p0); 321 t.StoreField(access, t.PointerConstant(smis), p0);
320 t.Return(p0); 322 t.Return(p0);
321 t.LowerAllNodesAndLowerChanges(); 323 t.LowerAllNodesAndLowerChanges();
322 324
323 for (int j = -5; j <= 5; j++) { 325 for (int j = -5; j <= 5; j++) {
324 Smi* expected = Smi::FromInt(j); 326 Smi* expected = Smi::FromInt(j);
325 smis[i] = Smi::FromInt(-100); 327 smis[i] = Smi::FromInt(-100);
326 CHECK_EQ(expected, t.Call(expected)); 328 CHECK_EQ(expected, t.Call(expected));
327 CHECK_EQ(expected, smis[i]); 329 CHECK_EQ(expected, smis[i]);
328 } 330 }
329 } 331 }
330 } 332 }
331 333
332 334
333 TEST(RunLoadElementFromUntaggedBase) { 335 TEST(RunLoadElementFromUntaggedBase) {
334 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), 336 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3),
335 Smi::FromInt(4), Smi::FromInt(5)}; 337 Smi::FromInt(4), Smi::FromInt(5)};
336 338
337 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes 339 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes
338 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index 340 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index
339 int offset = static_cast<int>(i * sizeof(Smi*)); 341 int offset = static_cast<int>(i * sizeof(Smi*));
340 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(), 342 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(),
341 kMachAnyTagged}; 343 MachineType::AnyTagged()};
342 344
343 SimplifiedLoweringTester<Object*> t; 345 SimplifiedLoweringTester<Object*> t;
344 Node* load = t.LoadElement(access, t.PointerConstant(smis), 346 Node* load = t.LoadElement(access, t.PointerConstant(smis),
345 t.Int32Constant(static_cast<int>(j))); 347 t.Int32Constant(static_cast<int>(j)));
346 t.Return(load); 348 t.Return(load);
347 t.LowerAllNodesAndLowerChanges(); 349 t.LowerAllNodesAndLowerChanges();
348 350
349 for (int k = -5; k <= 5; k++) { 351 for (int k = -5; k <= 5; k++) {
350 Smi* expected = Smi::FromInt(k); 352 Smi* expected = Smi::FromInt(k);
351 smis[i + j] = expected; 353 smis[i + j] = expected;
352 CHECK_EQ(expected, t.Call()); 354 CHECK_EQ(expected, t.Call());
353 } 355 }
354 } 356 }
355 } 357 }
356 } 358 }
357 359
358 360
359 TEST(RunStoreElementFromUntaggedBase) { 361 TEST(RunStoreElementFromUntaggedBase) {
360 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), 362 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3),
361 Smi::FromInt(4), Smi::FromInt(5)}; 363 Smi::FromInt(4), Smi::FromInt(5)};
362 364
363 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes 365 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes
364 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index 366 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index
365 int offset = static_cast<int>(i * sizeof(Smi*)); 367 int offset = static_cast<int>(i * sizeof(Smi*));
366 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(), 368 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(),
367 kMachAnyTagged}; 369 MachineType::AnyTagged()};
368 370
369 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 371 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
370 Node* p0 = t.Parameter(0); 372 Node* p0 = t.Parameter(0);
371 t.StoreElement(access, t.PointerConstant(smis), 373 t.StoreElement(access, t.PointerConstant(smis),
372 t.Int32Constant(static_cast<int>(j)), p0); 374 t.Int32Constant(static_cast<int>(j)), p0);
373 t.Return(p0); 375 t.Return(p0);
374 t.LowerAllNodesAndLowerChanges(); 376 t.LowerAllNodesAndLowerChanges();
375 377
376 for (int k = -5; k <= 5; k++) { 378 for (int k = -5; k <= 5; k++) {
377 Smi* expected = Smi::FromInt(k); 379 Smi* expected = Smi::FromInt(k);
378 smis[i + j] = Smi::FromInt(-100); 380 smis[i + j] = Smi::FromInt(-100);
379 CHECK_EQ(expected, t.Call(expected)); 381 CHECK_EQ(expected, t.Call(expected));
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 CHECK_EQ(a.GetElement(i), b.GetElement(i)); 587 CHECK_EQ(a.GetElement(i), b.GetElement(i));
586 } 588 }
587 } 589 }
588 } 590 }
589 } 591 }
590 592
591 593
592 TEST(RunAccessTests_uint8) { 594 TEST(RunAccessTests_uint8) {
593 uint8_t data[] = {0x07, 0x16, 0x25, 0x34, 0x43, 0x99, 595 uint8_t data[] = {0x07, 0x16, 0x25, 0x34, 0x43, 0x99,
594 0xab, 0x78, 0x89, 0x19, 0x2b, 0x38}; 596 0xab, 0x78, 0x89, 0x19, 0x2b, 0x38};
595 RunAccessTest<uint8_t>(kMachInt8, data, arraysize(data)); 597 RunAccessTest<uint8_t>(MachineType::Int8(), data, arraysize(data));
596 } 598 }
597 599
598 600
599 TEST(RunAccessTests_uint16) { 601 TEST(RunAccessTests_uint16) {
600 uint16_t data[] = {0x071a, 0x162b, 0x253c, 0x344d, 0x435e, 0x7777}; 602 uint16_t data[] = {0x071a, 0x162b, 0x253c, 0x344d, 0x435e, 0x7777};
601 RunAccessTest<uint16_t>(kMachInt16, data, arraysize(data)); 603 RunAccessTest<uint16_t>(MachineType::Int16(), data, arraysize(data));
602 } 604 }
603 605
604 606
605 TEST(RunAccessTests_int32) { 607 TEST(RunAccessTests_int32) {
606 int32_t data[] = {-211, 211, 628347, 2000000000, -2000000000, -1, -100000034}; 608 int32_t data[] = {-211, 211, 628347, 2000000000, -2000000000, -1, -100000034};
607 RunAccessTest<int32_t>(kMachInt32, data, arraysize(data)); 609 RunAccessTest<int32_t>(MachineType::Int32(), data, arraysize(data));
608 } 610 }
609 611
610 612
611 #define V8_2PART_INT64(a, b) (((static_cast<int64_t>(a) << 32) + 0x##b##u)) 613 #define V8_2PART_INT64(a, b) (((static_cast<int64_t>(a) << 32) + 0x##b##u))
612 614
613 615
614 TEST(RunAccessTests_int64) { 616 TEST(RunAccessTests_int64) {
615 if (kPointerSize != 8) return; 617 if (kPointerSize != 8) return;
616 int64_t data[] = {V8_2PART_INT64(0x10111213, 14151617), 618 int64_t data[] = {V8_2PART_INT64(0x10111213, 14151617),
617 V8_2PART_INT64(0x20212223, 24252627), 619 V8_2PART_INT64(0x20212223, 24252627),
618 V8_2PART_INT64(0x30313233, 34353637), 620 V8_2PART_INT64(0x30313233, 34353637),
619 V8_2PART_INT64(0xa0a1a2a3, a4a5a6a7), 621 V8_2PART_INT64(0xa0a1a2a3, a4a5a6a7),
620 V8_2PART_INT64(0xf0f1f2f3, f4f5f6f7)}; 622 V8_2PART_INT64(0xf0f1f2f3, f4f5f6f7)};
621 RunAccessTest<int64_t>(kMachInt64, data, arraysize(data)); 623 RunAccessTest<int64_t>(MachineType::Int64(), data, arraysize(data));
622 } 624 }
623 625
624 626
625 TEST(RunAccessTests_float64) { 627 TEST(RunAccessTests_float64) {
626 double data[] = {1.25, -1.25, 2.75, 11.0, 11100.8}; 628 double data[] = {1.25, -1.25, 2.75, 11.0, 11100.8};
627 RunAccessTest<double>(kMachFloat64, data, arraysize(data)); 629 RunAccessTest<double>(MachineType::Float64(), data, arraysize(data));
628 } 630 }
629 631
630 632
631 TEST(RunAccessTests_Smi) { 633 TEST(RunAccessTests_Smi) {
632 Smi* data[] = {Smi::FromInt(-1), Smi::FromInt(-9), 634 Smi* data[] = {Smi::FromInt(-1), Smi::FromInt(-9),
633 Smi::FromInt(0), Smi::FromInt(666), 635 Smi::FromInt(0), Smi::FromInt(666),
634 Smi::FromInt(77777), Smi::FromInt(Smi::kMaxValue)}; 636 Smi::FromInt(77777), Smi::FromInt(Smi::kMaxValue)};
635 RunAccessTest<Smi*>(kMachAnyTagged, data, arraysize(data)); 637 RunAccessTest<Smi*>(MachineType::AnyTagged(), data, arraysize(data));
636 } 638 }
637 639
638 640
639 TEST(RunAllocate) { 641 TEST(RunAllocate) {
640 PretenureFlag flag[] = {NOT_TENURED, TENURED}; 642 PretenureFlag flag[] = {NOT_TENURED, TENURED};
641 643
642 for (size_t i = 0; i < arraysize(flag); i++) { 644 for (size_t i = 0; i < arraysize(flag); i++) {
643 SimplifiedLoweringTester<HeapObject*> t; 645 SimplifiedLoweringTester<HeapObject*> t;
644 FieldAccess access = AccessBuilder::ForMap(); 646 FieldAccess access = AccessBuilder::ForMap();
645 Node* size = t.jsgraph.Constant(HeapNumber::kSize); 647 Node* size = t.jsgraph.Constant(HeapNumber::kSize);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 // Inserts the node as the return value of the graph. 736 // Inserts the node as the return value of the graph.
735 Node* Return(Node* node) { 737 Node* Return(Node* node) {
736 ret->ReplaceInput(0, node); 738 ret->ReplaceInput(0, node);
737 return node; 739 return node;
738 } 740 }
739 741
740 // Inserts the node as the effect input to the return of the graph. 742 // Inserts the node as the effect input to the return of the graph.
741 void Effect(Node* node) { ret->ReplaceInput(1, node); } 743 void Effect(Node* node) { ret->ReplaceInput(1, node); }
742 744
743 Node* ExampleWithOutput(MachineType type) { 745 Node* ExampleWithOutput(MachineType type) {
744 // TODO(titzer): use parameters with guaranteed representations. 746 if (type.semantic() == MachineSemantic::kInt32) {
745 if (type & kTypeInt32) {
746 return graph()->NewNode(machine()->Int32Add(), jsgraph.Int32Constant(1), 747 return graph()->NewNode(machine()->Int32Add(), jsgraph.Int32Constant(1),
747 jsgraph.Int32Constant(1)); 748 jsgraph.Int32Constant(1));
748 } else if (type & kTypeUint32) { 749 } else if (type.semantic() == MachineSemantic::kUint32) {
749 return graph()->NewNode(machine()->Word32Shr(), jsgraph.Int32Constant(1), 750 return graph()->NewNode(machine()->Word32Shr(), jsgraph.Int32Constant(1),
750 jsgraph.Int32Constant(1)); 751 jsgraph.Int32Constant(1));
751 } else if (type & kRepFloat64) { 752 } else if (type.representation() == MachineRepresentation::kFloat64) {
752 return graph()->NewNode(machine()->Float64Add(), 753 return graph()->NewNode(machine()->Float64Add(),
753 jsgraph.Float64Constant(1), 754 jsgraph.Float64Constant(1),
754 jsgraph.Float64Constant(1)); 755 jsgraph.Float64Constant(1));
755 } else if (type & kRepBit) { 756 } else if (type.representation() == MachineRepresentation::kBit) {
756 return graph()->NewNode(machine()->Word32Equal(), 757 return graph()->NewNode(machine()->Word32Equal(),
757 jsgraph.Int32Constant(1), 758 jsgraph.Int32Constant(1),
758 jsgraph.Int32Constant(1)); 759 jsgraph.Int32Constant(1));
759 } else if (type & kRepWord64) { 760 } else if (type.representation() == MachineRepresentation::kWord64) {
760 return graph()->NewNode(machine()->Int64Add(), Int64Constant(1), 761 return graph()->NewNode(machine()->Int64Add(), Int64Constant(1),
761 Int64Constant(1)); 762 Int64Constant(1));
762 } else { 763 } else {
763 CHECK(type & kRepTagged); 764 CHECK(type.representation() == MachineRepresentation::kTagged);
764 return p0; 765 return p0;
765 } 766 }
766 } 767 }
767 768
768 Node* Use(Node* node, MachineType type) { 769 Node* Use(Node* node, MachineType type) {
769 if (type & kTypeInt32) { 770 if (type.semantic() == MachineSemantic::kInt32) {
770 return graph()->NewNode(machine()->Int32LessThan(), node, 771 return graph()->NewNode(machine()->Int32LessThan(), node,
771 jsgraph.Int32Constant(1)); 772 jsgraph.Int32Constant(1));
772 } else if (type & kTypeUint32) { 773 } else if (type.semantic() == MachineSemantic::kUint32) {
773 return graph()->NewNode(machine()->Uint32LessThan(), node, 774 return graph()->NewNode(machine()->Uint32LessThan(), node,
774 jsgraph.Int32Constant(1)); 775 jsgraph.Int32Constant(1));
775 } else if (type & kRepFloat64) { 776 } else if (type.representation() == MachineRepresentation::kFloat64) {
776 return graph()->NewNode(machine()->Float64Add(), node, 777 return graph()->NewNode(machine()->Float64Add(), node,
777 jsgraph.Float64Constant(1)); 778 jsgraph.Float64Constant(1));
778 } else if (type & kRepWord64) { 779 } else if (type.representation() == MachineRepresentation::kWord64) {
779 return graph()->NewNode(machine()->Int64LessThan(), node, 780 return graph()->NewNode(machine()->Int64LessThan(), node,
780 Int64Constant(1)); 781 Int64Constant(1));
781 } else if (type & kRepWord32) { 782 } else if (type.representation() == MachineRepresentation::kWord32) {
782 return graph()->NewNode(machine()->Word32Equal(), node, 783 return graph()->NewNode(machine()->Word32Equal(), node,
783 jsgraph.Int32Constant(1)); 784 jsgraph.Int32Constant(1));
784 } else { 785 } else {
785 return graph()->NewNode(simplified()->ReferenceEqual(Type::Any()), node, 786 return graph()->NewNode(simplified()->ReferenceEqual(Type::Any()), node,
786 jsgraph.TrueConstant()); 787 jsgraph.TrueConstant());
787 } 788 }
788 } 789 }
789 790
790 Node* Branch(Node* cond) { 791 Node* Branch(Node* cond) {
791 Node* br = graph()->NewNode(common()->Branch(), cond, start); 792 Node* br = graph()->NewNode(common()->Branch(), cond, start);
(...skipping 11 matching lines...) Expand all
803 SimplifiedOperatorBuilder* simplified() { return &main_simplified_; } 804 SimplifiedOperatorBuilder* simplified() { return &main_simplified_; }
804 MachineOperatorBuilder* machine() { return &main_machine_; } 805 MachineOperatorBuilder* machine() { return &main_machine_; }
805 CommonOperatorBuilder* common() { return &main_common_; } 806 CommonOperatorBuilder* common() { return &main_common_; }
806 Graph* graph() { return main_graph_; } 807 Graph* graph() { return main_graph_; }
807 }; 808 };
808 809
809 810
810 TEST(LowerBooleanNot_bit_bit) { 811 TEST(LowerBooleanNot_bit_bit) {
811 // BooleanNot(x: kRepBit) used as kRepBit 812 // BooleanNot(x: kRepBit) used as kRepBit
812 TestingGraph t(Type::Boolean()); 813 TestingGraph t(Type::Boolean());
813 Node* b = t.ExampleWithOutput(kRepBit); 814 Node* b = t.ExampleWithOutput(MachineType::Bool());
814 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); 815 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b);
815 Node* use = t.Branch(inv); 816 Node* use = t.Branch(inv);
816 t.Lower(); 817 t.Lower();
817 Node* cmp = use->InputAt(0); 818 Node* cmp = use->InputAt(0);
818 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode()); 819 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode());
819 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); 820 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1));
820 Node* f = t.jsgraph.Int32Constant(0); 821 Node* f = t.jsgraph.Int32Constant(0);
821 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); 822 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1));
822 } 823 }
823 824
824 825
825 TEST(LowerBooleanNot_bit_tagged) { 826 TEST(LowerBooleanNot_bit_tagged) {
826 // BooleanNot(x: kRepBit) used as kRepTagged 827 // BooleanNot(x: kRepBit) used as kRepTagged
827 TestingGraph t(Type::Boolean()); 828 TestingGraph t(Type::Boolean());
828 Node* b = t.ExampleWithOutput(kRepBit); 829 Node* b = t.ExampleWithOutput(MachineType::Bool());
829 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); 830 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b);
830 Node* use = t.Use(inv, kRepTagged); 831 Node* use = t.Use(inv, MachineType::AnyTagged());
831 t.Return(use); 832 t.Return(use);
832 t.Lower(); 833 t.Lower();
833 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode()); 834 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode());
834 Node* cmp = use->InputAt(0)->InputAt(0); 835 Node* cmp = use->InputAt(0)->InputAt(0);
835 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode()); 836 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode());
836 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); 837 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1));
837 Node* f = t.jsgraph.Int32Constant(0); 838 Node* f = t.jsgraph.Int32Constant(0);
838 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); 839 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1));
839 } 840 }
840 841
(...skipping 11 matching lines...) Expand all
852 Node* f = t.jsgraph.FalseConstant(); 853 Node* f = t.jsgraph.FalseConstant();
853 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); 854 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1));
854 } 855 }
855 856
856 857
857 TEST(LowerBooleanNot_tagged_tagged) { 858 TEST(LowerBooleanNot_tagged_tagged) {
858 // BooleanNot(x: kRepTagged) used as kRepTagged 859 // BooleanNot(x: kRepTagged) used as kRepTagged
859 TestingGraph t(Type::Boolean()); 860 TestingGraph t(Type::Boolean());
860 Node* b = t.p0; 861 Node* b = t.p0;
861 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); 862 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b);
862 Node* use = t.Use(inv, kRepTagged); 863 Node* use = t.Use(inv, MachineType::AnyTagged());
863 t.Return(use); 864 t.Return(use);
864 t.Lower(); 865 t.Lower();
865 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode()); 866 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode());
866 Node* cmp = use->InputAt(0)->InputAt(0); 867 Node* cmp = use->InputAt(0)->InputAt(0);
867 CHECK_EQ(t.machine()->WordEqual()->opcode(), cmp->opcode()); 868 CHECK_EQ(t.machine()->WordEqual()->opcode(), cmp->opcode());
868 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); 869 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1));
869 Node* f = t.jsgraph.FalseConstant(); 870 Node* f = t.jsgraph.FalseConstant();
870 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); 871 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1));
871 } 872 }
872 873
873 874
874 TEST(LowerBooleanToNumber_bit_int32) { 875 TEST(LowerBooleanToNumber_bit_int32) {
875 // BooleanToNumber(x: kRepBit) used as kMachInt32 876 // BooleanToNumber(x: kRepBit) used as MachineType::Int32()
876 TestingGraph t(Type::Boolean()); 877 TestingGraph t(Type::Boolean());
877 Node* b = t.ExampleWithOutput(kRepBit); 878 Node* b = t.ExampleWithOutput(MachineType::Bool());
878 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); 879 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b);
879 Node* use = t.Use(cnv, kMachInt32); 880 Node* use = t.Use(cnv, MachineType::Int32());
880 t.Return(use); 881 t.Return(use);
881 t.Lower(); 882 t.Lower();
882 CHECK_EQ(b, use->InputAt(0)); 883 CHECK_EQ(b, use->InputAt(0));
883 } 884 }
884 885
885 886
886 TEST(LowerBooleanToNumber_tagged_int32) { 887 TEST(LowerBooleanToNumber_tagged_int32) {
887 // BooleanToNumber(x: kRepTagged) used as kMachInt32 888 // BooleanToNumber(x: kRepTagged) used as MachineType::Int32()
888 TestingGraph t(Type::Boolean()); 889 TestingGraph t(Type::Boolean());
889 Node* b = t.p0; 890 Node* b = t.p0;
890 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); 891 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b);
891 Node* use = t.Use(cnv, kMachInt32); 892 Node* use = t.Use(cnv, MachineType::Int32());
892 t.Return(use); 893 t.Return(use);
893 t.Lower(); 894 t.Lower();
894 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode()); 895 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode());
895 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1)); 896 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1));
896 Node* c = t.jsgraph.TrueConstant(); 897 Node* c = t.jsgraph.TrueConstant();
897 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1)); 898 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1));
898 } 899 }
899 900
900 901
901 TEST(LowerBooleanToNumber_bit_tagged) { 902 TEST(LowerBooleanToNumber_bit_tagged) {
902 // BooleanToNumber(x: kRepBit) used as kMachAnyTagged 903 // BooleanToNumber(x: kRepBit) used as MachineType::AnyTagged()
903 TestingGraph t(Type::Boolean()); 904 TestingGraph t(Type::Boolean());
904 Node* b = t.ExampleWithOutput(kRepBit); 905 Node* b = t.ExampleWithOutput(MachineType::Bool());
905 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); 906 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b);
906 Node* use = t.Use(cnv, kMachAnyTagged); 907 Node* use = t.Use(cnv, MachineType::AnyTagged());
907 t.Return(use); 908 t.Return(use);
908 t.Lower(); 909 t.Lower();
909 CHECK_EQ(b, use->InputAt(0)->InputAt(0)); 910 CHECK_EQ(b, use->InputAt(0)->InputAt(0));
910 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode()); 911 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode());
911 } 912 }
912 913
913 914
914 TEST(LowerBooleanToNumber_tagged_tagged) { 915 TEST(LowerBooleanToNumber_tagged_tagged) {
915 // BooleanToNumber(x: kRepTagged) used as kMachAnyTagged 916 // BooleanToNumber(x: kRepTagged) used as MachineType::AnyTagged()
916 TestingGraph t(Type::Boolean()); 917 TestingGraph t(Type::Boolean());
917 Node* b = t.p0; 918 Node* b = t.p0;
918 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); 919 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b);
919 Node* use = t.Use(cnv, kMachAnyTagged); 920 Node* use = t.Use(cnv, MachineType::AnyTagged());
920 t.Return(use); 921 t.Return(use);
921 t.Lower(); 922 t.Lower();
922 CHECK_EQ(cnv, use->InputAt(0)->InputAt(0)); 923 CHECK_EQ(cnv, use->InputAt(0)->InputAt(0));
923 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode()); 924 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode());
924 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode()); 925 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode());
925 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1)); 926 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1));
926 Node* c = t.jsgraph.TrueConstant(); 927 Node* c = t.jsgraph.TrueConstant();
927 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1)); 928 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1));
928 } 929 }
929 930
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 static void CheckChangeOf(IrOpcode::Value change, Node* of, Node* node) { 1040 static void CheckChangeOf(IrOpcode::Value change, Node* of, Node* node) {
1040 CHECK_EQ(change, node->opcode()); 1041 CHECK_EQ(change, node->opcode());
1041 CHECK_EQ(of, node->InputAt(0)); 1042 CHECK_EQ(of, node->InputAt(0));
1042 } 1043 }
1043 1044
1044 1045
1045 TEST(LowerNumberToInt32_to_ChangeTaggedToInt32) { 1046 TEST(LowerNumberToInt32_to_ChangeTaggedToInt32) {
1046 // NumberToInt32(x: kRepTagged | kTypeInt32) used as kRepWord32 1047 // NumberToInt32(x: kRepTagged | kTypeInt32) used as kRepWord32
1047 TestingGraph t(Type::Signed32()); 1048 TestingGraph t(Type::Signed32());
1048 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0); 1049 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0);
1049 Node* use = t.Use(trunc, kTypeInt32); 1050 Node* use = t.Use(trunc, MachineType::Int32());
1050 t.Return(use); 1051 t.Return(use);
1051 t.Lower(); 1052 t.Lower();
1052 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p0, use->InputAt(0)); 1053 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p0, use->InputAt(0));
1053 } 1054 }
1054 1055
1055 1056
1056 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32) { 1057 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32) {
1057 // NumberToInt32(x: kRepFloat64) used as kMachInt32 1058 // NumberToInt32(x: kRepFloat64) used as MachineType::Int32()
1058 TestingGraph t(Type::Number()); 1059 TestingGraph t(Type::Number());
1059 Node* p0 = t.ExampleWithOutput(kMachFloat64); 1060 Node* p0 = t.ExampleWithOutput(MachineType::Float64());
1060 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), p0); 1061 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), p0);
1061 Node* use = t.Use(trunc, kMachInt32); 1062 Node* use = t.Use(trunc, MachineType::Int32());
1062 t.Return(use); 1063 t.Return(use);
1063 t.Lower(); 1064 t.Lower();
1064 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); 1065 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0));
1065 } 1066 }
1066 1067
1067 1068
1068 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32_with_change) { 1069 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32_with_change) {
1069 // NumberToInt32(x: kTypeNumber | kRepTagged) used as kMachInt32 1070 // NumberToInt32(x: kTypeNumber | kRepTagged) used as MachineType::Int32()
1070 TestingGraph t(Type::Number()); 1071 TestingGraph t(Type::Number());
1071 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0); 1072 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0);
1072 Node* use = t.Use(trunc, kMachInt32); 1073 Node* use = t.Use(trunc, MachineType::Int32());
1073 t.Return(use); 1074 t.Return(use);
1074 t.Lower(); 1075 t.Lower();
1075 Node* node = use->InputAt(0); 1076 Node* node = use->InputAt(0);
1076 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode()); 1077 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode());
1077 Node* of = node->InputAt(0); 1078 Node* of = node->InputAt(0);
1078 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode()); 1079 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode());
1079 CHECK_EQ(t.p0, of->InputAt(0)); 1080 CHECK_EQ(t.p0, of->InputAt(0));
1080 } 1081 }
1081 1082
1082 1083
1083 TEST(LowerNumberToUint32_to_ChangeTaggedToUint32) { 1084 TEST(LowerNumberToUint32_to_ChangeTaggedToUint32) {
1084 // NumberToUint32(x: kRepTagged | kTypeUint32) used as kRepWord32 1085 // NumberToUint32(x: kRepTagged | kTypeUint32) used as kRepWord32
1085 TestingGraph t(Type::Unsigned32()); 1086 TestingGraph t(Type::Unsigned32());
1086 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0); 1087 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0);
1087 Node* use = t.Use(trunc, kTypeUint32); 1088 Node* use = t.Use(trunc, MachineType::Uint32());
1088 t.Return(use); 1089 t.Return(use);
1089 t.Lower(); 1090 t.Lower();
1090 CheckChangeOf(IrOpcode::kChangeTaggedToUint32, t.p0, use->InputAt(0)); 1091 CheckChangeOf(IrOpcode::kChangeTaggedToUint32, t.p0, use->InputAt(0));
1091 } 1092 }
1092 1093
1093 1094
1094 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32) { 1095 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32) {
1095 // NumberToUint32(x: kRepFloat64) used as kMachUint32 1096 // NumberToUint32(x: kRepFloat64) used as MachineType::Uint32()
1096 TestingGraph t(Type::Number()); 1097 TestingGraph t(Type::Number());
1097 Node* p0 = t.ExampleWithOutput(kMachFloat64); 1098 Node* p0 = t.ExampleWithOutput(MachineType::Float64());
1098 // TODO(titzer): run the typer here, or attach machine type to param. 1099 // TODO(titzer): run the typer here, or attach machine type to param.
1099 NodeProperties::SetType(p0, Type::Number()); 1100 NodeProperties::SetType(p0, Type::Number());
1100 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), p0); 1101 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), p0);
1101 Node* use = t.Use(trunc, kMachUint32); 1102 Node* use = t.Use(trunc, MachineType::Uint32());
1102 t.Return(use); 1103 t.Return(use);
1103 t.Lower(); 1104 t.Lower();
1104 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); 1105 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0));
1105 } 1106 }
1106 1107
1107 1108
1108 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_with_change) { 1109 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_with_change) {
1109 // NumberToInt32(x: kTypeNumber | kRepTagged) used as kMachUint32 1110 // NumberToInt32(x: kTypeNumber | kRepTagged) used as MachineType::Uint32()
1110 TestingGraph t(Type::Number()); 1111 TestingGraph t(Type::Number());
1111 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0); 1112 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0);
1112 Node* use = t.Use(trunc, kMachUint32); 1113 Node* use = t.Use(trunc, MachineType::Uint32());
1113 t.Return(use); 1114 t.Return(use);
1114 t.Lower(); 1115 t.Lower();
1115 Node* node = use->InputAt(0); 1116 Node* node = use->InputAt(0);
1116 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode()); 1117 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode());
1117 Node* of = node->InputAt(0); 1118 Node* of = node->InputAt(0);
1118 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode()); 1119 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode());
1119 CHECK_EQ(t.p0, of->InputAt(0)); 1120 CHECK_EQ(t.p0, of->InputAt(0));
1120 } 1121 }
1121 1122
1122 1123
1123 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_uint32) { 1124 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_uint32) {
1124 // NumberToUint32(x: kRepFloat64) used as kRepWord32 1125 // NumberToUint32(x: kRepFloat64) used as kRepWord32
1125 TestingGraph t(Type::Unsigned32()); 1126 TestingGraph t(Type::Unsigned32());
1126 Node* input = t.ExampleWithOutput(kMachFloat64); 1127 Node* input = t.ExampleWithOutput(MachineType::Float64());
1127 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), input); 1128 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), input);
1128 Node* use = t.Use(trunc, kRepWord32); 1129 Node* use = t.Use(trunc, MachineType::RepWord32());
1129 t.Return(use); 1130 t.Return(use);
1130 t.Lower(); 1131 t.Lower();
1131 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, input, use->InputAt(0)); 1132 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, input, use->InputAt(0));
1132 } 1133 }
1133 1134
1134 1135
1135 TEST(LowerReferenceEqual_to_wordeq) { 1136 TEST(LowerReferenceEqual_to_wordeq) {
1136 TestingGraph t(Type::Any(), Type::Any()); 1137 TestingGraph t(Type::Any(), Type::Any());
1137 IrOpcode::Value opcode = 1138 IrOpcode::Value opcode =
1138 static_cast<IrOpcode::Value>(t.machine()->WordEqual()->opcode()); 1139 static_cast<IrOpcode::Value>(t.machine()->WordEqual()->opcode());
(...skipping 24 matching lines...) Expand all
1163 NodeProperties::SetType(in, type); 1164 NodeProperties::SetType(in, type);
1164 Node* use = t.Use(in, to); 1165 Node* use = t.Use(in, to);
1165 t.Return(use); 1166 t.Return(use);
1166 t.Lower(); 1167 t.Lower();
1167 CHECK_EQ(expected, use->InputAt(0)->opcode()); 1168 CHECK_EQ(expected, use->InputAt(0)->opcode());
1168 CHECK_EQ(in, use->InputAt(0)->InputAt(0)); 1169 CHECK_EQ(in, use->InputAt(0)->InputAt(0));
1169 } 1170 }
1170 1171
1171 1172
1172 TEST(InsertBasicChanges) { 1173 TEST(InsertBasicChanges) {
1173 CheckChangeInsertion(IrOpcode::kChangeFloat64ToInt32, kRepFloat64, kTypeInt32, 1174 CheckChangeInsertion(IrOpcode::kChangeFloat64ToInt32, MachineType::Float64(),
1174 Type::Signed32()); 1175 MachineType::Int32(), Type::Signed32());
1175 CheckChangeInsertion(IrOpcode::kChangeFloat64ToUint32, kRepFloat64, 1176 CheckChangeInsertion(IrOpcode::kChangeFloat64ToUint32, MachineType::Float64(),
1176 kTypeUint32, Type::Unsigned32()); 1177 MachineType::Uint32(), Type::Unsigned32());
1177 CheckChangeInsertion(IrOpcode::kTruncateFloat64ToInt32, kRepFloat64, 1178 CheckChangeInsertion(IrOpcode::kTruncateFloat64ToInt32,
1178 kTypeUint32, Type::Integral32()); 1179 MachineType::Float64(), MachineType::Uint32(),
1179 CheckChangeInsertion(IrOpcode::kChangeTaggedToInt32, kRepTagged, kTypeInt32, 1180 Type::Integral32());
1180 Type::Signed32()); 1181 CheckChangeInsertion(IrOpcode::kChangeTaggedToInt32, MachineType::AnyTagged(),
1181 CheckChangeInsertion(IrOpcode::kChangeTaggedToUint32, kRepTagged, kTypeUint32, 1182 MachineType::Int32(), Type::Signed32());
1183 CheckChangeInsertion(IrOpcode::kChangeTaggedToUint32,
1184 MachineType::AnyTagged(), MachineType::Uint32(),
1182 Type::Unsigned32()); 1185 Type::Unsigned32());
1183 1186
1184 CheckChangeInsertion(IrOpcode::kChangeFloat64ToTagged, kRepFloat64, 1187 CheckChangeInsertion(IrOpcode::kChangeFloat64ToTagged, MachineType::Float64(),
1185 kRepTagged); 1188 MachineType::AnyTagged());
1186 CheckChangeInsertion(IrOpcode::kChangeTaggedToFloat64, kRepTagged, 1189 CheckChangeInsertion(IrOpcode::kChangeTaggedToFloat64,
1187 kRepFloat64); 1190 MachineType::AnyTagged(), MachineType::Float64());
1188 1191
1189 CheckChangeInsertion(IrOpcode::kChangeInt32ToFloat64, kTypeInt32, 1192 CheckChangeInsertion(IrOpcode::kChangeInt32ToFloat64, MachineType::Int32(),
1190 kRepFloat64); 1193 MachineType::Float64());
1191 CheckChangeInsertion(IrOpcode::kChangeInt32ToTagged, kTypeInt32, kRepTagged); 1194 CheckChangeInsertion(IrOpcode::kChangeInt32ToTagged, MachineType::Int32(),
1195 MachineType::AnyTagged());
1192 1196
1193 CheckChangeInsertion(IrOpcode::kChangeUint32ToFloat64, kTypeUint32, 1197 CheckChangeInsertion(IrOpcode::kChangeUint32ToFloat64, MachineType::Uint32(),
1194 kRepFloat64); 1198 MachineType::Float64());
1195 CheckChangeInsertion(IrOpcode::kChangeUint32ToTagged, kTypeUint32, 1199 CheckChangeInsertion(IrOpcode::kChangeUint32ToTagged, MachineType::Uint32(),
1196 kRepTagged); 1200 MachineType::AnyTagged());
1197 } 1201 }
1198 1202
1199 1203
1200 static void CheckChangesAroundBinop(TestingGraph* t, const Operator* op, 1204 static void CheckChangesAroundBinop(TestingGraph* t, const Operator* op,
1201 IrOpcode::Value input_change, 1205 IrOpcode::Value input_change,
1202 IrOpcode::Value output_change) { 1206 IrOpcode::Value output_change) {
1203 Node* binop = 1207 Node* binop =
1204 op->ControlInputCount() == 0 1208 op->ControlInputCount() == 0
1205 ? t->graph()->NewNode(op, t->p0, t->p1) 1209 ? t->graph()->NewNode(op, t->p0, t->p1)
1206 : t->graph()->NewNode(op, t->p0, t->p1, t->graph()->start()); 1210 : t->graph()->NewNode(op, t->p0, t->p1, t->graph()->start());
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1299 Node* index = load_or_store->InputAt(1); 1303 Node* index = load_or_store->InputAt(1);
1300 if (kPointerSize == 8) { 1304 if (kPointerSize == 8) {
1301 CHECK_EQ(IrOpcode::kChangeUint32ToUint64, index->opcode()); 1305 CHECK_EQ(IrOpcode::kChangeUint32ToUint64, index->opcode());
1302 index = index->InputAt(0); 1306 index = index->InputAt(0);
1303 } 1307 }
1304 1308
1305 Int32BinopMatcher mindex(index); 1309 Int32BinopMatcher mindex(index);
1306 CHECK_EQ(IrOpcode::kInt32Add, mindex.node()->opcode()); 1310 CHECK_EQ(IrOpcode::kInt32Add, mindex.node()->opcode());
1307 CHECK(mindex.right().Is(access.header_size - access.tag())); 1311 CHECK(mindex.right().Is(access.header_size - access.tag()));
1308 1312
1309 const int element_size_shift = ElementSizeLog2Of(access.machine_type); 1313 const int element_size_shift =
1314 ElementSizeLog2Of(access.machine_type.representation());
1310 if (element_size_shift) { 1315 if (element_size_shift) {
1311 Int32BinopMatcher shl(mindex.left().node()); 1316 Int32BinopMatcher shl(mindex.left().node());
1312 CHECK_EQ(IrOpcode::kWord32Shl, shl.node()->opcode()); 1317 CHECK_EQ(IrOpcode::kWord32Shl, shl.node()->opcode());
1313 CHECK(shl.right().Is(element_size_shift)); 1318 CHECK(shl.right().Is(element_size_shift));
1314 return shl.left().node(); 1319 return shl.left().node();
1315 } else { 1320 } else {
1316 return mindex.left().node(); 1321 return mindex.left().node();
1317 } 1322 }
1318 } 1323 }
1319 1324
1320 1325
1321 const MachineType kMachineReps[] = {kMachInt8, kMachInt16, kMachInt32, 1326 const MachineType kMachineReps[] = {
1322 kMachUint32, kMachInt64, kMachFloat64, 1327 MachineType::Int8(), MachineType::Int16(), MachineType::Int32(),
1323 kMachAnyTagged}; 1328 MachineType::Uint32(), MachineType::Int64(), MachineType::Float64(),
1329 MachineType::AnyTagged()};
1324 1330
1325 } // namespace 1331 } // namespace
1326 1332
1327 1333
1328 TEST(LowerLoadField_to_load) { 1334 TEST(LowerLoadField_to_load) {
1329 TestingGraph t(Type::Any(), Type::Signed32()); 1335 TestingGraph t(Type::Any(), Type::Signed32());
1330 1336
1331 for (size_t i = 0; i < arraysize(kMachineReps); i++) { 1337 for (size_t i = 0; i < arraysize(kMachineReps); i++) {
1332 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1338 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1333 Handle<Name>::null(), Type::Any(), kMachineReps[i]}; 1339 Handle<Name>::null(), Type::Any(), kMachineReps[i]};
1334 1340
1335 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, 1341 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0,
1336 t.start, t.start); 1342 t.start, t.start);
1337 Node* use = t.Use(load, kMachineReps[i]); 1343 Node* use = t.Use(load, kMachineReps[i]);
1338 t.Return(use); 1344 t.Return(use);
1339 t.LowerAllNodesAndLowerChanges(); 1345 t.LowerAllNodesAndLowerChanges();
1340 CHECK_EQ(IrOpcode::kLoad, load->opcode()); 1346 CHECK_EQ(IrOpcode::kLoad, load->opcode());
1341 CHECK_EQ(t.p0, load->InputAt(0)); 1347 CHECK_EQ(t.p0, load->InputAt(0));
1342 CheckFieldAccessArithmetic(access, load); 1348 CheckFieldAccessArithmetic(access, load);
1343 1349
1344 MachineType rep = OpParameter<MachineType>(load); 1350 MachineType rep = LoadRepresentationOf(load->op());
1345 CHECK_EQ(kMachineReps[i], rep); 1351 CHECK_EQ(kMachineReps[i], rep);
1346 } 1352 }
1347 } 1353 }
1348 1354
1349 1355
1350 TEST(LowerStoreField_to_store) { 1356 TEST(LowerStoreField_to_store) {
1351 { 1357 {
1352 TestingGraph t(Type::Any(), Type::Signed32()); 1358 TestingGraph t(Type::Any(), Type::Signed32());
1353 1359
1354 for (size_t i = 0; i < arraysize(kMachineReps); i++) { 1360 for (size_t i = 0; i < arraysize(kMachineReps); i++) {
1355 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1361 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1356 Handle<Name>::null(), Type::Any(), kMachineReps[i]}; 1362 Handle<Name>::null(), Type::Any(), kMachineReps[i]};
1357 1363
1358 1364
1359 Node* val = t.ExampleWithOutput(kMachineReps[i]); 1365 Node* val = t.ExampleWithOutput(kMachineReps[i]);
1360 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, 1366 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0,
1361 val, t.start, t.start); 1367 val, t.start, t.start);
1362 t.Effect(store); 1368 t.Effect(store);
1363 t.LowerAllNodesAndLowerChanges(); 1369 t.LowerAllNodesAndLowerChanges();
1364 CHECK_EQ(IrOpcode::kStore, store->opcode()); 1370 CHECK_EQ(IrOpcode::kStore, store->opcode());
1365 CHECK_EQ(val, store->InputAt(2)); 1371 CHECK_EQ(val, store->InputAt(2));
1366 CheckFieldAccessArithmetic(access, store); 1372 CheckFieldAccessArithmetic(access, store);
1367 1373
1368 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); 1374 StoreRepresentation rep = OpParameter<StoreRepresentation>(store);
1369 if (kMachineReps[i] & kRepTagged) { 1375 if (kMachineReps[i].representation() == MachineRepresentation::kTagged) {
1370 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind()); 1376 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind());
1371 } 1377 }
1372 CHECK_EQ(kMachineReps[i], rep.machine_type()); 1378 CHECK_EQ(kMachineReps[i], rep.machine_type());
1373 } 1379 }
1374 } 1380 }
1375 { 1381 {
1376 HandleAndZoneScope scope; 1382 HandleAndZoneScope scope;
1377 Zone* z = scope.main_zone(); 1383 Zone* z = scope.main_zone();
1378 TestingGraph t(Type::Any(), Type::Intersect(Type::SignedSmall(), 1384 TestingGraph t(Type::Any(), Type::Intersect(Type::SignedSmall(),
1379 Type::TaggedSigned(), z)); 1385 Type::TaggedSigned(), z));
1380 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1386 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1381 Handle<Name>::null(), Type::Any(), kMachAnyTagged}; 1387 Handle<Name>::null(), Type::Any(),
1388 MachineType::AnyTagged()};
1382 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, 1389 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0,
1383 t.p1, t.start, t.start); 1390 t.p1, t.start, t.start);
1384 t.Effect(store); 1391 t.Effect(store);
1385 t.LowerAllNodesAndLowerChanges(); 1392 t.LowerAllNodesAndLowerChanges();
1386 CHECK_EQ(IrOpcode::kStore, store->opcode()); 1393 CHECK_EQ(IrOpcode::kStore, store->opcode());
1387 CHECK_EQ(t.p1, store->InputAt(2)); 1394 CHECK_EQ(t.p1, store->InputAt(2));
1388 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); 1395 StoreRepresentation rep = OpParameter<StoreRepresentation>(store);
1389 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind()); 1396 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind());
1390 } 1397 }
1391 } 1398 }
1392 1399
1393 1400
1394 TEST(LowerLoadElement_to_load) { 1401 TEST(LowerLoadElement_to_load) {
1395 TestingGraph t(Type::Any(), Type::Signed32()); 1402 TestingGraph t(Type::Any(), Type::Signed32());
1396 1403
1397 for (size_t i = 0; i < arraysize(kMachineReps); i++) { 1404 for (size_t i = 0; i < arraysize(kMachineReps); i++) {
1398 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1405 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1399 Type::Any(), kMachineReps[i]}; 1406 Type::Any(), kMachineReps[i]};
1400 1407
1401 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, 1408 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0,
1402 t.p1, t.start, t.start); 1409 t.p1, t.start, t.start);
1403 Node* use = t.Use(load, kMachineReps[i]); 1410 Node* use = t.Use(load, kMachineReps[i]);
1404 t.Return(use); 1411 t.Return(use);
1405 t.LowerAllNodesAndLowerChanges(); 1412 t.LowerAllNodesAndLowerChanges();
1406 CHECK_EQ(IrOpcode::kLoad, load->opcode()); 1413 CHECK_EQ(IrOpcode::kLoad, load->opcode());
1407 CHECK_EQ(t.p0, load->InputAt(0)); 1414 CHECK_EQ(t.p0, load->InputAt(0));
1408 CheckElementAccessArithmetic(access, load); 1415 CheckElementAccessArithmetic(access, load);
1409 1416
1410 MachineType rep = OpParameter<MachineType>(load); 1417 MachineType rep = LoadRepresentationOf(load->op());
1411 CHECK_EQ(kMachineReps[i], rep); 1418 CHECK_EQ(kMachineReps[i], rep);
1412 } 1419 }
1413 } 1420 }
1414 1421
1415 1422
1416 TEST(LowerStoreElement_to_store) { 1423 TEST(LowerStoreElement_to_store) {
1417 { 1424 {
1418 TestingGraph t(Type::Any(), Type::Signed32()); 1425 TestingGraph t(Type::Any(), Type::Signed32());
1419 1426
1420 for (size_t i = 0; i < arraysize(kMachineReps); i++) { 1427 for (size_t i = 0; i < arraysize(kMachineReps); i++) {
1421 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1428 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1422 Type::Any(), kMachineReps[i]}; 1429 Type::Any(), kMachineReps[i]};
1423 1430
1424 Node* val = t.ExampleWithOutput(kMachineReps[i]); 1431 Node* val = t.ExampleWithOutput(kMachineReps[i]);
1425 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access), 1432 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access),
1426 t.p0, t.p1, val, t.start, t.start); 1433 t.p0, t.p1, val, t.start, t.start);
1427 t.Effect(store); 1434 t.Effect(store);
1428 t.LowerAllNodesAndLowerChanges(); 1435 t.LowerAllNodesAndLowerChanges();
1429 CHECK_EQ(IrOpcode::kStore, store->opcode()); 1436 CHECK_EQ(IrOpcode::kStore, store->opcode());
1430 CHECK_EQ(val, store->InputAt(2)); 1437 CHECK_EQ(val, store->InputAt(2));
1431 CheckElementAccessArithmetic(access, store); 1438 CheckElementAccessArithmetic(access, store);
1432 1439
1433 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); 1440 StoreRepresentation rep = OpParameter<StoreRepresentation>(store);
1434 if (kMachineReps[i] & kRepTagged) { 1441 if (kMachineReps[i].representation() == MachineRepresentation::kTagged) {
1435 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind()); 1442 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind());
1436 } 1443 }
1437 CHECK_EQ(kMachineReps[i], rep.machine_type()); 1444 CHECK_EQ(kMachineReps[i], rep.machine_type());
1438 } 1445 }
1439 } 1446 }
1440 { 1447 {
1441 HandleAndZoneScope scope; 1448 HandleAndZoneScope scope;
1442 Zone* z = scope.main_zone(); 1449 Zone* z = scope.main_zone();
1443 TestingGraph t( 1450 TestingGraph t(
1444 Type::Any(), Type::Signed32(), 1451 Type::Any(), Type::Signed32(),
1445 Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), z)); 1452 Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), z));
1446 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1453 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1447 Type::Any(), kMachAnyTagged}; 1454 Type::Any(), MachineType::AnyTagged()};
1448 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, 1455 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0,
1449 t.p1, t.p2, t.start, t.start); 1456 t.p1, t.p2, t.start, t.start);
1450 t.Effect(store); 1457 t.Effect(store);
1451 t.LowerAllNodesAndLowerChanges(); 1458 t.LowerAllNodesAndLowerChanges();
1452 CHECK_EQ(IrOpcode::kStore, store->opcode()); 1459 CHECK_EQ(IrOpcode::kStore, store->opcode());
1453 CHECK_EQ(t.p2, store->InputAt(2)); 1460 CHECK_EQ(t.p2, store->InputAt(2));
1454 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); 1461 StoreRepresentation rep = OpParameter<StoreRepresentation>(store);
1455 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind()); 1462 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind());
1456 } 1463 }
1457 } 1464 }
1458 1465
1459 1466
1460 TEST(InsertChangeForLoadElementIndex) { 1467 TEST(InsertChangeForLoadElementIndex) {
1461 // LoadElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length) => 1468 // LoadElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length) =>
1462 // Load(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k)) 1469 // Load(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k))
1463 TestingGraph t(Type::Any(), Type::Signed32()); 1470 TestingGraph t(Type::Any(), Type::Signed32());
1464 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), 1471 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(),
1465 kMachAnyTagged}; 1472 MachineType::AnyTagged()};
1466 1473
1467 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, 1474 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0,
1468 t.p1, t.start, t.start); 1475 t.p1, t.start, t.start);
1469 t.Return(load); 1476 t.Return(load);
1470 t.Lower(); 1477 t.Lower();
1471 CHECK_EQ(IrOpcode::kLoadElement, load->opcode()); 1478 CHECK_EQ(IrOpcode::kLoadElement, load->opcode());
1472 CHECK_EQ(t.p0, load->InputAt(0)); 1479 CHECK_EQ(t.p0, load->InputAt(0));
1473 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, load->InputAt(1)); 1480 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, load->InputAt(1));
1474 } 1481 }
1475 1482
1476 1483
1477 TEST(InsertChangeForStoreElementIndex) { 1484 TEST(InsertChangeForStoreElementIndex) {
1478 // StoreElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length, val) => 1485 // StoreElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length, val) =>
1479 // Store(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k), val) 1486 // Store(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k), val)
1480 TestingGraph t(Type::Any(), Type::Signed32()); 1487 TestingGraph t(Type::Any(), Type::Signed32());
1481 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), 1488 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(),
1482 kMachAnyTagged}; 1489 MachineType::AnyTagged()};
1483 1490
1484 Node* store = 1491 Node* store =
1485 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, t.p1, 1492 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, t.p1,
1486 t.jsgraph.TrueConstant(), t.start, t.start); 1493 t.jsgraph.TrueConstant(), t.start, t.start);
1487 t.Effect(store); 1494 t.Effect(store);
1488 t.Lower(); 1495 t.Lower();
1489 CHECK_EQ(IrOpcode::kStoreElement, store->opcode()); 1496 CHECK_EQ(IrOpcode::kStoreElement, store->opcode());
1490 CHECK_EQ(t.p0, store->InputAt(0)); 1497 CHECK_EQ(t.p0, store->InputAt(0));
1491 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, store->InputAt(1)); 1498 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, store->InputAt(1));
1492 } 1499 }
1493 1500
1494 1501
1495 TEST(InsertChangeForLoadElement) { 1502 TEST(InsertChangeForLoadElement) {
1496 // TODO(titzer): test all load/store representation change insertions. 1503 // TODO(titzer): test all load/store representation change insertions.
1497 TestingGraph t(Type::Any(), Type::Signed32(), Type::Any()); 1504 TestingGraph t(Type::Any(), Type::Signed32(), Type::Any());
1498 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), 1505 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(),
1499 kMachFloat64}; 1506 MachineType::Float64()};
1500 1507
1501 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, 1508 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0,
1502 t.p1, t.start, t.start); 1509 t.p1, t.start, t.start);
1503 t.Return(load); 1510 t.Return(load);
1504 t.Lower(); 1511 t.Lower();
1505 CHECK_EQ(IrOpcode::kLoadElement, load->opcode()); 1512 CHECK_EQ(IrOpcode::kLoadElement, load->opcode());
1506 CHECK_EQ(t.p0, load->InputAt(0)); 1513 CHECK_EQ(t.p0, load->InputAt(0));
1507 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0)); 1514 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0));
1508 } 1515 }
1509 1516
1510 1517
1511 TEST(InsertChangeForLoadField) { 1518 TEST(InsertChangeForLoadField) {
1512 // TODO(titzer): test all load/store representation change insertions. 1519 // TODO(titzer): test all load/store representation change insertions.
1513 TestingGraph t(Type::Any(), Type::Signed32()); 1520 TestingGraph t(Type::Any(), Type::Signed32());
1514 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1521 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1515 Handle<Name>::null(), Type::Any(), kMachFloat64}; 1522 Handle<Name>::null(), Type::Any(),
1523 MachineType::Float64()};
1516 1524
1517 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, 1525 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0,
1518 t.start, t.start); 1526 t.start, t.start);
1519 t.Return(load); 1527 t.Return(load);
1520 t.Lower(); 1528 t.Lower();
1521 CHECK_EQ(IrOpcode::kLoadField, load->opcode()); 1529 CHECK_EQ(IrOpcode::kLoadField, load->opcode());
1522 CHECK_EQ(t.p0, load->InputAt(0)); 1530 CHECK_EQ(t.p0, load->InputAt(0));
1523 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0)); 1531 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0));
1524 } 1532 }
1525 1533
1526 1534
1527 TEST(InsertChangeForStoreElement) { 1535 TEST(InsertChangeForStoreElement) {
1528 // TODO(titzer): test all load/store representation change insertions. 1536 // TODO(titzer): test all load/store representation change insertions.
1529 TestingGraph t(Type::Any(), Type::Signed32()); 1537 TestingGraph t(Type::Any(), Type::Signed32());
1530 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), 1538 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(),
1531 kMachFloat64}; 1539 MachineType::Float64()};
1532 1540
1533 Node* store = 1541 Node* store =
1534 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, 1542 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0,
1535 t.jsgraph.Int32Constant(0), t.p1, t.start, t.start); 1543 t.jsgraph.Int32Constant(0), t.p1, t.start, t.start);
1536 t.Effect(store); 1544 t.Effect(store);
1537 t.Lower(); 1545 t.Lower();
1538 1546
1539 CHECK_EQ(IrOpcode::kStoreElement, store->opcode()); 1547 CHECK_EQ(IrOpcode::kStoreElement, store->opcode());
1540 CHECK_EQ(t.p0, store->InputAt(0)); 1548 CHECK_EQ(t.p0, store->InputAt(0));
1541 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(2)); 1549 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(2));
1542 } 1550 }
1543 1551
1544 1552
1545 TEST(InsertChangeForStoreField) { 1553 TEST(InsertChangeForStoreField) {
1546 // TODO(titzer): test all load/store representation change insertions. 1554 // TODO(titzer): test all load/store representation change insertions.
1547 TestingGraph t(Type::Any(), Type::Signed32()); 1555 TestingGraph t(Type::Any(), Type::Signed32());
1548 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1556 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1549 Handle<Name>::null(), Type::Any(), kMachFloat64}; 1557 Handle<Name>::null(), Type::Any(),
1558 MachineType::Float64()};
1550 1559
1551 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, 1560 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0,
1552 t.p1, t.start, t.start); 1561 t.p1, t.start, t.start);
1553 t.Effect(store); 1562 t.Effect(store);
1554 t.Lower(); 1563 t.Lower();
1555 1564
1556 CHECK_EQ(IrOpcode::kStoreField, store->opcode()); 1565 CHECK_EQ(IrOpcode::kStoreField, store->opcode());
1557 CHECK_EQ(t.p0, store->InputAt(0)); 1566 CHECK_EQ(t.p0, store->InputAt(0));
1558 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(1)); 1567 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(1));
1559 } 1568 }
1560 1569
1561 1570
1562 TEST(UpdatePhi) { 1571 TEST(UpdatePhi) {
1563 TestingGraph t(Type::Any(), Type::Signed32()); 1572 TestingGraph t(Type::Any(), Type::Signed32());
1564 static const MachineType kMachineTypes[] = {kMachInt32, kMachUint32, 1573 static const MachineType kMachineTypes[] = {
1565 kMachFloat64}; 1574 MachineType::Int32(), MachineType::Uint32(), MachineType::Float64()};
1566 Type* kTypes[] = {Type::Signed32(), Type::Unsigned32(), Type::Number()}; 1575 Type* kTypes[] = {Type::Signed32(), Type::Unsigned32(), Type::Number()};
1567 1576
1568 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { 1577 for (size_t i = 0; i < arraysize(kMachineTypes); i++) {
1569 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, 1578 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize,
1570 Handle<Name>::null(), kTypes[i], kMachineTypes[i]}; 1579 Handle<Name>::null(), kTypes[i], kMachineTypes[i]};
1571 1580
1572 Node* load0 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, 1581 Node* load0 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0,
1573 t.start, t.start); 1582 t.start, t.start);
1574 Node* load1 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p1, 1583 Node* load1 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p1,
1575 t.start, t.start); 1584 t.start, t.start);
1576 Node* phi = t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), load0, 1585 Node* phi =
1577 load1, t.start); 1586 t.graph()->NewNode(t.common()->Phi(MachineRepresentation::kTagged, 2),
1587 load0, load1, t.start);
1578 t.Return(t.Use(phi, kMachineTypes[i])); 1588 t.Return(t.Use(phi, kMachineTypes[i]));
1579 t.Lower(); 1589 t.Lower();
1580 1590
1581 CHECK_EQ(IrOpcode::kPhi, phi->opcode()); 1591 CHECK_EQ(IrOpcode::kPhi, phi->opcode());
1582 CHECK_EQ(RepresentationOf(kMachineTypes[i]), 1592 CHECK_EQ(kMachineTypes[i].representation(), PhiRepresentationOf(phi->op()));
1583 RepresentationOf(OpParameter<MachineType>(phi)));
1584 } 1593 }
1585 } 1594 }
1586 1595
1587 1596
1588 TEST(RunNumberDivide_minus_1_TruncatingToInt32) { 1597 TEST(RunNumberDivide_minus_1_TruncatingToInt32) {
1589 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1598 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1590 Node* num = t.NumberToInt32(t.Parameter(0)); 1599 Node* num = t.NumberToInt32(t.Parameter(0));
1591 Node* div = t.NumberDivide(num, t.jsgraph.Constant(-1)); 1600 Node* div = t.NumberDivide(num, t.jsgraph.Constant(-1));
1592 Node* trunc = t.NumberToInt32(div); 1601 Node* trunc = t.NumberToInt32(div);
1593 t.Return(trunc); 1602 t.Return(trunc);
1594 1603
1595 t.LowerAllNodesAndLowerChanges(); 1604 t.LowerAllNodesAndLowerChanges();
1596 t.GenerateCode(); 1605 t.GenerateCode();
1597 1606
1598 FOR_INT32_INPUTS(i) { 1607 FOR_INT32_INPUTS(i) {
1599 int32_t x = 0 - *i; 1608 int32_t x = 0 - *i;
1600 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); 1609 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i));
1601 } 1610 }
1602 } 1611 }
1603 1612
1604 1613
1605 TEST(RunNumberMultiply_TruncatingToInt32) { 1614 TEST(RunNumberMultiply_TruncatingToInt32) {
1606 int32_t constants[] = {-100, -10, -1, 0, 1, 100, 1000, 3000999}; 1615 int32_t constants[] = {-100, -10, -1, 0, 1, 100, 1000, 3000999};
1607 1616
1608 for (size_t i = 0; i < arraysize(constants); i++) { 1617 for (size_t i = 0; i < arraysize(constants); i++) {
1609 double k = static_cast<double>(constants[i]); 1618 double k = static_cast<double>(constants[i]);
1610 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1619 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1611 Node* num = t.NumberToInt32(t.Parameter(0)); 1620 Node* num = t.NumberToInt32(t.Parameter(0));
1612 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k)); 1621 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k));
1613 Node* trunc = t.NumberToInt32(mul); 1622 Node* trunc = t.NumberToInt32(mul);
1614 t.Return(trunc); 1623 t.Return(trunc);
1615 1624
1616 t.LowerAllNodesAndLowerChanges(); 1625 t.LowerAllNodesAndLowerChanges();
1617 t.GenerateCode(); 1626 t.GenerateCode();
1618 1627
1619 FOR_INT32_INPUTS(i) { 1628 FOR_INT32_INPUTS(i) {
1620 int32_t x = DoubleToInt32(static_cast<double>(*i) * k); 1629 int32_t x = DoubleToInt32(static_cast<double>(*i) * k);
1621 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); 1630 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i));
1622 } 1631 }
1623 } 1632 }
1624 } 1633 }
1625 1634
1626 1635
1627 TEST(RunNumberMultiply_TruncatingToUint32) { 1636 TEST(RunNumberMultiply_TruncatingToUint32) {
1628 uint32_t constants[] = {0, 1, 2, 3, 4, 100, 1000, 1024, 2048, 3000999}; 1637 uint32_t constants[] = {0, 1, 2, 3, 4, 100, 1000, 1024, 2048, 3000999};
1629 1638
1630 for (size_t i = 0; i < arraysize(constants); i++) { 1639 for (size_t i = 0; i < arraysize(constants); i++) {
1631 double k = static_cast<double>(constants[i]); 1640 double k = static_cast<double>(constants[i]);
1632 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1641 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1633 Node* num = t.NumberToUint32(t.Parameter(0)); 1642 Node* num = t.NumberToUint32(t.Parameter(0));
1634 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k)); 1643 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k));
1635 Node* trunc = t.NumberToUint32(mul); 1644 Node* trunc = t.NumberToUint32(mul);
1636 t.Return(trunc); 1645 t.Return(trunc);
1637 1646
1638 t.LowerAllNodesAndLowerChanges(); 1647 t.LowerAllNodesAndLowerChanges();
1639 t.GenerateCode(); 1648 t.GenerateCode();
1640 1649
1641 FOR_UINT32_INPUTS(i) { 1650 FOR_UINT32_INPUTS(i) {
1642 uint32_t x = DoubleToUint32(static_cast<double>(*i) * k); 1651 uint32_t x = DoubleToUint32(static_cast<double>(*i) * k);
1643 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); 1652 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i));
1644 } 1653 }
1645 } 1654 }
1646 } 1655 }
1647 1656
1648 1657
1649 TEST(RunNumberDivide_2_TruncatingToUint32) { 1658 TEST(RunNumberDivide_2_TruncatingToUint32) {
1650 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1659 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1651 Node* num = t.NumberToUint32(t.Parameter(0)); 1660 Node* num = t.NumberToUint32(t.Parameter(0));
1652 Node* div = t.NumberDivide(num, t.jsgraph.Constant(2)); 1661 Node* div = t.NumberDivide(num, t.jsgraph.Constant(2));
1653 Node* trunc = t.NumberToUint32(div); 1662 Node* trunc = t.NumberToUint32(div);
1654 t.Return(trunc); 1663 t.Return(trunc);
1655 1664
1656 t.LowerAllNodesAndLowerChanges(); 1665 t.LowerAllNodesAndLowerChanges();
1657 t.GenerateCode(); 1666 t.GenerateCode();
1658 1667
1659 FOR_UINT32_INPUTS(i) { 1668 FOR_UINT32_INPUTS(i) {
1660 uint32_t x = DoubleToUint32(static_cast<double>(*i / 2.0)); 1669 uint32_t x = DoubleToUint32(static_cast<double>(*i / 2.0));
(...skipping 25 matching lines...) Expand all
1686 } 1695 }
1687 1696
1688 1697
1689 TEST(NumberDivide_TruncatingToInt32) { 1698 TEST(NumberDivide_TruncatingToInt32) {
1690 int32_t constants[] = {-100, -10, 1, 4, 100, 1000}; 1699 int32_t constants[] = {-100, -10, 1, 4, 100, 1000};
1691 1700
1692 for (size_t i = 0; i < arraysize(constants); i++) { 1701 for (size_t i = 0; i < arraysize(constants); i++) {
1693 TestingGraph t(Type::Signed32()); 1702 TestingGraph t(Type::Signed32());
1694 Node* k = t.jsgraph.Constant(constants[i]); 1703 Node* k = t.jsgraph.Constant(constants[i]);
1695 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); 1704 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k);
1696 Node* use = t.Use(div, kMachInt32); 1705 Node* use = t.Use(div, MachineType::Int32());
1697 t.Return(use); 1706 t.Return(use);
1698 t.Lower(); 1707 t.Lower();
1699 1708
1700 CHECK_EQ(IrOpcode::kInt32Div, use->InputAt(0)->opcode()); 1709 CHECK_EQ(IrOpcode::kInt32Div, use->InputAt(0)->opcode());
1701 } 1710 }
1702 } 1711 }
1703 1712
1704 1713
1705 TEST(RunNumberDivide_TruncatingToInt32) { 1714 TEST(RunNumberDivide_TruncatingToInt32) {
1706 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048}; 1715 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048};
1707 1716
1708 for (size_t i = 0; i < arraysize(constants); i++) { 1717 for (size_t i = 0; i < arraysize(constants); i++) {
1709 int32_t k = constants[i]; 1718 int32_t k = constants[i];
1710 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1719 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1711 Node* num = t.NumberToInt32(t.Parameter(0)); 1720 Node* num = t.NumberToInt32(t.Parameter(0));
1712 Node* div = t.NumberDivide(num, t.jsgraph.Constant(k)); 1721 Node* div = t.NumberDivide(num, t.jsgraph.Constant(k));
1713 Node* trunc = t.NumberToInt32(div); 1722 Node* trunc = t.NumberToInt32(div);
1714 t.Return(trunc); 1723 t.Return(trunc);
1715 1724
1716 t.LowerAllNodesAndLowerChanges(); 1725 t.LowerAllNodesAndLowerChanges();
1717 t.GenerateCode(); 1726 t.GenerateCode();
1718 1727
1719 FOR_INT32_INPUTS(i) { 1728 FOR_INT32_INPUTS(i) {
1720 if (*i == INT_MAX) continue; // exclude max int. 1729 if (*i == INT_MAX) continue; // exclude max int.
1721 int32_t x = DoubleToInt32(static_cast<double>(*i) / k); 1730 int32_t x = DoubleToInt32(static_cast<double>(*i) / k);
1722 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); 1731 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i));
1723 } 1732 }
1724 } 1733 }
1725 } 1734 }
1726 1735
1727 1736
1728 TEST(NumberDivide_TruncatingToUint32) { 1737 TEST(NumberDivide_TruncatingToUint32) {
1729 double constants[] = {1, 3, 100, 1000, 100998348}; 1738 double constants[] = {1, 3, 100, 1000, 100998348};
1730 1739
1731 for (size_t i = 0; i < arraysize(constants); i++) { 1740 for (size_t i = 0; i < arraysize(constants); i++) {
1732 TestingGraph t(Type::Unsigned32()); 1741 TestingGraph t(Type::Unsigned32());
1733 Node* k = t.jsgraph.Constant(constants[i]); 1742 Node* k = t.jsgraph.Constant(constants[i]);
1734 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); 1743 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k);
1735 Node* use = t.Use(div, kMachUint32); 1744 Node* use = t.Use(div, MachineType::Uint32());
1736 t.Return(use); 1745 t.Return(use);
1737 t.Lower(); 1746 t.Lower();
1738 1747
1739 CHECK_EQ(IrOpcode::kUint32Div, use->InputAt(0)->opcode()); 1748 CHECK_EQ(IrOpcode::kUint32Div, use->InputAt(0)->opcode());
1740 } 1749 }
1741 } 1750 }
1742 1751
1743 1752
1744 TEST(RunNumberDivide_TruncatingToUint32) { 1753 TEST(RunNumberDivide_TruncatingToUint32) {
1745 uint32_t constants[] = {100, 10, 1, 1, 2, 4, 1000, 1024, 2048}; 1754 uint32_t constants[] = {100, 10, 1, 1, 2, 4, 1000, 1024, 2048};
1746 1755
1747 for (size_t i = 0; i < arraysize(constants); i++) { 1756 for (size_t i = 0; i < arraysize(constants); i++) {
1748 uint32_t k = constants[i]; 1757 uint32_t k = constants[i];
1749 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1758 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1750 Node* num = t.NumberToUint32(t.Parameter(0)); 1759 Node* num = t.NumberToUint32(t.Parameter(0));
1751 Node* div = t.NumberDivide(num, t.jsgraph.Constant(static_cast<double>(k))); 1760 Node* div = t.NumberDivide(num, t.jsgraph.Constant(static_cast<double>(k)));
1752 Node* trunc = t.NumberToUint32(div); 1761 Node* trunc = t.NumberToUint32(div);
1753 t.Return(trunc); 1762 t.Return(trunc);
1754 1763
1755 t.LowerAllNodesAndLowerChanges(); 1764 t.LowerAllNodesAndLowerChanges();
1756 t.GenerateCode(); 1765 t.GenerateCode();
1757 1766
1758 FOR_UINT32_INPUTS(i) { 1767 FOR_UINT32_INPUTS(i) {
1759 uint32_t x = *i / k; 1768 uint32_t x = *i / k;
1760 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); 1769 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i));
1761 } 1770 }
1762 } 1771 }
1763 } 1772 }
1764 1773
1765 1774
1766 TEST(NumberDivide_BadConstants) { 1775 TEST(NumberDivide_BadConstants) {
1767 { 1776 {
1768 TestingGraph t(Type::Signed32()); 1777 TestingGraph t(Type::Signed32());
1769 Node* k = t.jsgraph.Constant(-1); 1778 Node* k = t.jsgraph.Constant(-1);
1770 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); 1779 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k);
1771 Node* use = t.Use(div, kMachInt32); 1780 Node* use = t.Use(div, MachineType::Int32());
1772 t.Return(use); 1781 t.Return(use);
1773 t.Lower(); 1782 t.Lower();
1774 1783
1775 CHECK_EQ(IrOpcode::kInt32Sub, use->InputAt(0)->opcode()); 1784 CHECK_EQ(IrOpcode::kInt32Sub, use->InputAt(0)->opcode());
1776 } 1785 }
1777 1786
1778 { 1787 {
1779 TestingGraph t(Type::Signed32()); 1788 TestingGraph t(Type::Signed32());
1780 Node* k = t.jsgraph.Constant(0); 1789 Node* k = t.jsgraph.Constant(0);
1781 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); 1790 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k);
1782 Node* use = t.Use(div, kMachInt32); 1791 Node* use = t.Use(div, MachineType::Int32());
1783 t.Return(use); 1792 t.Return(use);
1784 t.Lower(); 1793 t.Lower();
1785 1794
1786 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode()); 1795 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode());
1787 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0))); 1796 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0)));
1788 } 1797 }
1789 1798
1790 { 1799 {
1791 TestingGraph t(Type::Unsigned32()); 1800 TestingGraph t(Type::Unsigned32());
1792 Node* k = t.jsgraph.Constant(0); 1801 Node* k = t.jsgraph.Constant(0);
1793 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); 1802 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k);
1794 Node* use = t.Use(div, kMachUint32); 1803 Node* use = t.Use(div, MachineType::Uint32());
1795 t.Return(use); 1804 t.Return(use);
1796 t.Lower(); 1805 t.Lower();
1797 1806
1798 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode()); 1807 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode());
1799 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0))); 1808 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0)));
1800 } 1809 }
1801 } 1810 }
1802 1811
1803 1812
1804 TEST(NumberModulus_TruncatingToInt32) { 1813 TEST(NumberModulus_TruncatingToInt32) {
1805 int32_t constants[] = {-100, -10, 1, 4, 100, 1000}; 1814 int32_t constants[] = {-100, -10, 1, 4, 100, 1000};
1806 1815
1807 for (size_t i = 0; i < arraysize(constants); i++) { 1816 for (size_t i = 0; i < arraysize(constants); i++) {
1808 TestingGraph t(Type::Signed32()); 1817 TestingGraph t(Type::Signed32());
1809 Node* k = t.jsgraph.Constant(constants[i]); 1818 Node* k = t.jsgraph.Constant(constants[i]);
1810 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); 1819 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k);
1811 Node* use = t.Use(mod, kMachInt32); 1820 Node* use = t.Use(mod, MachineType::Int32());
1812 t.Return(use); 1821 t.Return(use);
1813 t.Lower(); 1822 t.Lower();
1814 1823
1815 CHECK_EQ(IrOpcode::kInt32Mod, use->InputAt(0)->opcode()); 1824 CHECK_EQ(IrOpcode::kInt32Mod, use->InputAt(0)->opcode());
1816 } 1825 }
1817 } 1826 }
1818 1827
1819 1828
1820 TEST(RunNumberModulus_TruncatingToInt32) { 1829 TEST(RunNumberModulus_TruncatingToInt32) {
1821 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048}; 1830 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048};
1822 1831
1823 for (size_t i = 0; i < arraysize(constants); i++) { 1832 for (size_t i = 0; i < arraysize(constants); i++) {
1824 int32_t k = constants[i]; 1833 int32_t k = constants[i];
1825 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1834 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1826 Node* num = t.NumberToInt32(t.Parameter(0)); 1835 Node* num = t.NumberToInt32(t.Parameter(0));
1827 Node* mod = t.NumberModulus(num, t.jsgraph.Constant(k)); 1836 Node* mod = t.NumberModulus(num, t.jsgraph.Constant(k));
1828 Node* trunc = t.NumberToInt32(mod); 1837 Node* trunc = t.NumberToInt32(mod);
1829 t.Return(trunc); 1838 t.Return(trunc);
1830 1839
1831 t.LowerAllNodesAndLowerChanges(); 1840 t.LowerAllNodesAndLowerChanges();
1832 t.GenerateCode(); 1841 t.GenerateCode();
1833 1842
1834 FOR_INT32_INPUTS(i) { 1843 FOR_INT32_INPUTS(i) {
1835 if (*i == INT_MAX) continue; // exclude max int. 1844 if (*i == INT_MAX) continue; // exclude max int.
(...skipping 18 matching lines...) Expand all
1854 CHECK_EQ(IrOpcode::kUint32Mod, t.ret->InputAt(0)->InputAt(0)->opcode()); 1863 CHECK_EQ(IrOpcode::kUint32Mod, t.ret->InputAt(0)->InputAt(0)->opcode());
1855 } 1864 }
1856 } 1865 }
1857 1866
1858 1867
1859 TEST(RunNumberModulus_TruncatingToUint32) { 1868 TEST(RunNumberModulus_TruncatingToUint32) {
1860 uint32_t constants[] = {1, 2, 100, 1000, 1024, 2048}; 1869 uint32_t constants[] = {1, 2, 100, 1000, 1024, 2048};
1861 1870
1862 for (size_t i = 0; i < arraysize(constants); i++) { 1871 for (size_t i = 0; i < arraysize(constants); i++) {
1863 uint32_t k = constants[i]; 1872 uint32_t k = constants[i];
1864 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); 1873 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged());
1865 Node* num = t.NumberToUint32(t.Parameter(0)); 1874 Node* num = t.NumberToUint32(t.Parameter(0));
1866 Node* mod = 1875 Node* mod =
1867 t.NumberModulus(num, t.jsgraph.Constant(static_cast<double>(k))); 1876 t.NumberModulus(num, t.jsgraph.Constant(static_cast<double>(k)));
1868 Node* trunc = t.NumberToUint32(mod); 1877 Node* trunc = t.NumberToUint32(mod);
1869 t.Return(trunc); 1878 t.Return(trunc);
1870 1879
1871 t.LowerAllNodesAndLowerChanges(); 1880 t.LowerAllNodesAndLowerChanges();
1872 t.GenerateCode(); 1881 t.GenerateCode();
1873 1882
1874 FOR_UINT32_INPUTS(i) { 1883 FOR_UINT32_INPUTS(i) {
(...skipping 14 matching lines...) Expand all
1889 t.Return(mod); 1898 t.Return(mod);
1890 t.Lower(); 1899 t.Lower();
1891 1900
1892 CHECK_EQ(IrOpcode::kFloat64Mod, mod->opcode()); // Pesky -0 behavior. 1901 CHECK_EQ(IrOpcode::kFloat64Mod, mod->opcode()); // Pesky -0 behavior.
1893 } 1902 }
1894 } 1903 }
1895 1904
1896 1905
1897 TEST(NumberModulus_Uint32) { 1906 TEST(NumberModulus_Uint32) {
1898 const double kConstants[] = {2, 100, 1000, 1024, 2048}; 1907 const double kConstants[] = {2, 100, 1000, 1024, 2048};
1899 const MachineType kTypes[] = {kMachInt32, kMachUint32}; 1908 const MachineType kTypes[] = {MachineType::Int32(), MachineType::Uint32()};
1900 1909
1901 for (auto const type : kTypes) { 1910 for (auto const type : kTypes) {
1902 for (auto const c : kConstants) { 1911 for (auto const c : kConstants) {
1903 TestingGraph t(Type::Unsigned32()); 1912 TestingGraph t(Type::Unsigned32());
1904 Node* k = t.jsgraph.Constant(c); 1913 Node* k = t.jsgraph.Constant(c);
1905 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); 1914 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k);
1906 Node* use = t.Use(mod, type); 1915 Node* use = t.Use(mod, type);
1907 t.Return(use); 1916 t.Return(use);
1908 t.Lower(); 1917 t.Lower();
1909 1918
1910 CHECK_EQ(IrOpcode::kUint32Mod, use->InputAt(0)->opcode()); 1919 CHECK_EQ(IrOpcode::kUint32Mod, use->InputAt(0)->opcode());
1911 } 1920 }
1912 } 1921 }
1913 } 1922 }
1914 1923
1915 1924
1916 TEST(PhiRepresentation) { 1925 TEST(PhiRepresentation) {
1917 HandleAndZoneScope scope; 1926 HandleAndZoneScope scope;
1918 Zone* z = scope.main_zone(); 1927 Zone* z = scope.main_zone();
1919 1928
1920 struct TestData { 1929 struct TestData {
1921 Type* arg1; 1930 Type* arg1;
1922 Type* arg2; 1931 Type* arg2;
1923 MachineType use; 1932 MachineType use;
1924 MachineTypeUnion expected; 1933 MachineRepresentation expected;
1925 }; 1934 };
1926 1935
1927 TestData test_data[] = { 1936 TestData test_data[] = {
1928 {Type::Signed32(), Type::Unsigned32(), kMachInt32, 1937 {Type::Signed32(), Type::Unsigned32(), MachineType::Int32(),
1929 kRepWord32 | kTypeNumber}, 1938 MachineRepresentation::kWord32},
1930 {Type::Signed32(), Type::Unsigned32(), kMachUint32, 1939 {Type::Signed32(), Type::Unsigned32(), MachineType::Uint32(),
1931 kRepWord32 | kTypeNumber}, 1940 MachineRepresentation::kWord32},
1932 {Type::Signed32(), Type::Signed32(), kMachInt32, kMachInt32}, 1941 {Type::Signed32(), Type::Signed32(), MachineType::Int32(),
1933 {Type::Unsigned32(), Type::Unsigned32(), kMachInt32, kMachUint32}, 1942 MachineRepresentation::kWord32},
1934 {Type::Number(), Type::Signed32(), kMachInt32, kRepWord32 | kTypeNumber}}; 1943 {Type::Unsigned32(), Type::Unsigned32(), MachineType::Int32(),
1944 MachineRepresentation::kWord32},
1945 {Type::Number(), Type::Signed32(), MachineType::Int32(),
1946 MachineRepresentation::kWord32}};
1935 1947
1936 for (auto const d : test_data) { 1948 for (auto const d : test_data) {
1937 TestingGraph t(d.arg1, d.arg2, Type::Boolean()); 1949 TestingGraph t(d.arg1, d.arg2, Type::Boolean());
1938 1950
1939 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start); 1951 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start);
1940 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br); 1952 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br);
1941 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br); 1953 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br);
1942 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb); 1954 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb);
1943 1955
1944 Node* phi = 1956 Node* phi = t.graph()->NewNode(
1945 t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), t.p0, t.p1, m); 1957 t.common()->Phi(MachineRepresentation::kTagged, 2), t.p0, t.p1, m);
1946 1958
1947 Type* phi_type = Type::Union(d.arg1, d.arg2, z); 1959 Type* phi_type = Type::Union(d.arg1, d.arg2, z);
1948 NodeProperties::SetType(phi, phi_type); 1960 NodeProperties::SetType(phi, phi_type);
1949 1961
1950 Node* use = t.Use(phi, d.use); 1962 Node* use = t.Use(phi, d.use);
1951 t.Return(use); 1963 t.Return(use);
1952 t.Lower(); 1964 t.Lower();
1953 1965
1954 CHECK_EQ(d.expected, OpParameter<MachineType>(phi)); 1966 CHECK_EQ(d.expected, PhiRepresentationOf(phi->op()));
1955 } 1967 }
1956 } 1968 }
1957 1969
1958 } // namespace compiler 1970 } // namespace compiler
1959 } // namespace internal 1971 } // namespace internal
1960 } // namespace v8 1972 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/compiler/test-run-native-calls.cc ('k') | test/unittests/compiler/arm/instruction-selector-arm-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698