OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/js-graph.h" | 5 #include "src/compiler/js-graph.h" |
6 #include "src/compiler/js-typed-lowering.h" | 6 #include "src/compiler/js-typed-lowering.h" |
7 #include "src/compiler/machine-operator.h" | 7 #include "src/compiler/machine-operator.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 #include "src/compiler/opcodes.h" | 9 #include "src/compiler/opcodes.h" |
10 #include "src/compiler/operator-properties.h" | 10 #include "src/compiler/operator-properties.h" |
11 #include "src/compiler/typer.h" | 11 #include "src/compiler/typer.h" |
12 #include "test/cctest/cctest.h" | 12 #include "test/cctest/cctest.h" |
13 | 13 |
14 using namespace v8::internal; | 14 using namespace v8::internal; |
15 using namespace v8::internal::compiler; | 15 using namespace v8::internal::compiler; |
16 | 16 |
17 #ifndef TEST_WITH_STRONG | 17 #ifndef TEST_WITH_STRENGTH |
18 #define TEST_WITH_STRONG(Name) \ | 18 #define TEST_WITH_STRENGTH(Name) \ |
19 static void Test##Name(); \ | 19 static void Test##Name(); \ |
20 static void TestWithStrong##Name(LanguageMode language_mode); \ | 20 static void TestWithStrength##Name(Strength strength); \ |
21 CcTest register_test_##Name(Test##Name, __FILE__, #Name, NULL, true, true); \ | 21 CcTest register_test_##Name(Test##Name, __FILE__, #Name, NULL, true, true); \ |
22 static void Test##Name() { \ | 22 static void Test##Name() { \ |
23 TestWithStrong##Name(LanguageMode::SLOPPY); \ | 23 TestWithStrength##Name(Strength::NORMAL); \ |
24 TestWithStrong##Name(LanguageMode::STRONG); \ | 24 TestWithStrength##Name(Strength::STRONG); \ |
25 } \ | 25 } \ |
26 static void TestWithStrong##Name(LanguageMode language_mode) | 26 static void TestWithStrength##Name(Strength strength) |
27 #endif | 27 #endif |
28 | 28 |
29 | 29 |
30 class JSTypedLoweringTester : public HandleAndZoneScope { | 30 class JSTypedLoweringTester : public HandleAndZoneScope { |
31 public: | 31 public: |
32 explicit JSTypedLoweringTester(int num_parameters = 0) | 32 explicit JSTypedLoweringTester(int num_parameters = 0) |
33 : isolate(main_isolate()), | 33 : isolate(main_isolate()), |
34 binop(NULL), | 34 binop(NULL), |
35 unop(NULL), | 35 unop(NULL), |
36 javascript(main_zone()), | 36 javascript(main_zone()), |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 } | 226 } |
227 | 227 |
228 | 228 |
229 static IrOpcode::Value NumberToI32(bool is_signed) { | 229 static IrOpcode::Value NumberToI32(bool is_signed) { |
230 return is_signed ? IrOpcode::kNumberToInt32 : IrOpcode::kNumberToUint32; | 230 return is_signed ? IrOpcode::kNumberToInt32 : IrOpcode::kNumberToUint32; |
231 } | 231 } |
232 | 232 |
233 | 233 |
234 // TODO(turbofan): Lowering of StringAdd is disabled for now. | 234 // TODO(turbofan): Lowering of StringAdd is disabled for now. |
235 #if 0 | 235 #if 0 |
236 TEST_WITH_STRONG(StringBinops) { | 236 TEST_WITH_STRENGTH(StringBinops) { |
237 JSTypedLoweringTester R; | 237 JSTypedLoweringTester R; |
238 | 238 |
239 for (size_t i = 0; i < arraysize(kStringTypes); ++i) { | 239 for (size_t i = 0; i < arraysize(kStringTypes); ++i) { |
240 Node* p0 = R.Parameter(kStringTypes[i], 0); | 240 Node* p0 = R.Parameter(kStringTypes[i], 0); |
241 | 241 |
242 for (size_t j = 0; j < arraysize(kStringTypes); ++j) { | 242 for (size_t j = 0; j < arraysize(kStringTypes); ++j) { |
243 Node* p1 = R.Parameter(kStringTypes[j], 1); | 243 Node* p1 = R.Parameter(kStringTypes[j], 1); |
244 | 244 |
245 Node* add = R.Binop(R.javascript.Add(language_mode), p0, p1); | 245 Node* add = R.Binop(R.javascript.Add(strength), p0, p1); |
246 Node* r = R.reduce(add); | 246 Node* r = R.reduce(add); |
247 | 247 |
248 R.CheckPureBinop(IrOpcode::kStringAdd, r); | 248 R.CheckPureBinop(IrOpcode::kStringAdd, r); |
249 CHECK_EQ(p0, r->InputAt(0)); | 249 CHECK_EQ(p0, r->InputAt(0)); |
250 CHECK_EQ(p1, r->InputAt(1)); | 250 CHECK_EQ(p1, r->InputAt(1)); |
251 } | 251 } |
252 } | 252 } |
253 } | 253 } |
254 #endif | 254 #endif |
255 | 255 |
256 | 256 |
257 TEST_WITH_STRONG(AddNumber1) { | 257 TEST_WITH_STRENGTH(AddNumber1) { |
258 JSTypedLoweringTester R; | 258 JSTypedLoweringTester R; |
259 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { | 259 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { |
260 Node* p0 = R.Parameter(kNumberTypes[i], 0); | 260 Node* p0 = R.Parameter(kNumberTypes[i], 0); |
261 Node* p1 = R.Parameter(kNumberTypes[i], 1); | 261 Node* p1 = R.Parameter(kNumberTypes[i], 1); |
262 Node* add = R.Binop(R.javascript.Add(language_mode), p0, p1); | 262 Node* add = R.Binop(R.javascript.Add(strength), p0, p1); |
263 Node* r = R.reduce(add); | 263 Node* r = R.reduce(add); |
264 | 264 |
265 R.CheckPureBinop(IrOpcode::kNumberAdd, r); | 265 R.CheckPureBinop(IrOpcode::kNumberAdd, r); |
266 CHECK_EQ(p0, r->InputAt(0)); | 266 CHECK_EQ(p0, r->InputAt(0)); |
267 CHECK_EQ(p1, r->InputAt(1)); | 267 CHECK_EQ(p1, r->InputAt(1)); |
268 } | 268 } |
269 } | 269 } |
270 | 270 |
271 | 271 |
272 TEST_WITH_STRONG(NumberBinops) { | 272 TEST_WITH_STRENGTH(NumberBinops) { |
273 JSTypedLoweringTester R; | 273 JSTypedLoweringTester R; |
274 const Operator* ops[] = { | 274 const Operator* ops[] = { |
275 R.javascript.Add(language_mode), R.simplified.NumberAdd(), | 275 R.javascript.Add(strength), R.simplified.NumberAdd(), |
276 R.javascript.Subtract(language_mode), R.simplified.NumberSubtract(), | 276 R.javascript.Subtract(strength), R.simplified.NumberSubtract(), |
277 R.javascript.Multiply(language_mode), R.simplified.NumberMultiply(), | 277 R.javascript.Multiply(strength), R.simplified.NumberMultiply(), |
278 R.javascript.Divide(language_mode), R.simplified.NumberDivide(), | 278 R.javascript.Divide(strength), R.simplified.NumberDivide(), |
279 R.javascript.Modulus(language_mode), R.simplified.NumberModulus(), | 279 R.javascript.Modulus(strength), R.simplified.NumberModulus(), |
280 }; | 280 }; |
281 | 281 |
282 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { | 282 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { |
283 Node* p0 = R.Parameter(kNumberTypes[i], 0); | 283 Node* p0 = R.Parameter(kNumberTypes[i], 0); |
284 | 284 |
285 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) { | 285 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) { |
286 Node* p1 = R.Parameter(kNumberTypes[j], 1); | 286 Node* p1 = R.Parameter(kNumberTypes[j], 1); |
287 | 287 |
288 for (size_t k = 0; k < arraysize(ops); k += 2) { | 288 for (size_t k = 0; k < arraysize(ops); k += 2) { |
289 Node* add = R.Binop(ops[k], p0, p1); | 289 Node* add = R.Binop(ops[k], p0, p1); |
(...skipping 19 matching lines...) Expand all Loading... |
309 double v = OpParameter<double>(new_input); | 309 double v = OpParameter<double>(new_input); |
310 double e = static_cast<double>(is_signed ? FastD2I(v) : FastD2UI(v)); | 310 double e = static_cast<double>(is_signed ? FastD2I(v) : FastD2UI(v)); |
311 CHECK_EQ(e, v); | 311 CHECK_EQ(e, v); |
312 } | 312 } |
313 } | 313 } |
314 | 314 |
315 | 315 |
316 // A helper class for testing lowering of bitwise shift operators. | 316 // A helper class for testing lowering of bitwise shift operators. |
317 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester { | 317 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester { |
318 public: | 318 public: |
319 explicit JSBitwiseShiftTypedLoweringTester(LanguageMode language_mode) | 319 explicit JSBitwiseShiftTypedLoweringTester(Strength strength) |
320 : JSTypedLoweringTester(), language_mode_(language_mode) { | 320 : JSTypedLoweringTester(), strength_(strength) { |
321 int i = 0; | 321 int i = 0; |
322 set(i++, javascript.ShiftLeft(language_mode_), true); | 322 set(i++, javascript.ShiftLeft(strength_), true); |
323 set(i++, machine.Word32Shl(), false); | 323 set(i++, machine.Word32Shl(), false); |
324 set(i++, javascript.ShiftRight(language_mode_), true); | 324 set(i++, javascript.ShiftRight(strength_), true); |
325 set(i++, machine.Word32Sar(), false); | 325 set(i++, machine.Word32Sar(), false); |
326 set(i++, javascript.ShiftRightLogical(language_mode_), false); | 326 set(i++, javascript.ShiftRightLogical(strength_), false); |
327 set(i++, machine.Word32Shr(), false); | 327 set(i++, machine.Word32Shr(), false); |
328 } | 328 } |
329 static const int kNumberOps = 6; | 329 static const int kNumberOps = 6; |
330 const Operator* ops[kNumberOps]; | 330 const Operator* ops[kNumberOps]; |
331 bool signedness[kNumberOps]; | 331 bool signedness[kNumberOps]; |
332 | 332 |
333 private: | 333 private: |
334 LanguageMode language_mode_; | 334 Strength strength_; |
335 void set(int idx, const Operator* op, bool s) { | 335 void set(int idx, const Operator* op, bool s) { |
336 ops[idx] = op; | 336 ops[idx] = op; |
337 signedness[idx] = s; | 337 signedness[idx] = s; |
338 } | 338 } |
339 }; | 339 }; |
340 | 340 |
341 | 341 |
342 TEST(Int32BitwiseShifts) { | 342 TEST(Int32BitwiseShifts) { |
343 JSBitwiseShiftTypedLoweringTester R(LanguageMode::SLOPPY); | 343 JSBitwiseShiftTypedLoweringTester R(Strength::NORMAL); |
344 | 344 |
345 Type* types[] = { | 345 Type* types[] = { |
346 Type::SignedSmall(), Type::UnsignedSmall(), Type::Negative32(), | 346 Type::SignedSmall(), Type::UnsignedSmall(), Type::Negative32(), |
347 Type::Unsigned31(), Type::Unsigned32(), Type::Signed32(), | 347 Type::Unsigned31(), Type::Unsigned32(), Type::Signed32(), |
348 Type::MinusZero(), Type::NaN(), Type::Undefined(), | 348 Type::MinusZero(), Type::NaN(), Type::Undefined(), |
349 Type::Null(), Type::Boolean(), Type::Number(), | 349 Type::Null(), Type::Boolean(), Type::Number(), |
350 Type::PlainNumber(), Type::String()}; | 350 Type::PlainNumber(), Type::String()}; |
351 | 351 |
352 for (size_t i = 0; i < arraysize(types); ++i) { | 352 for (size_t i = 0; i < arraysize(types); ++i) { |
353 Node* p0 = R.Parameter(types[i], 0); | 353 Node* p0 = R.Parameter(types[i], 0); |
(...skipping 20 matching lines...) Expand all Loading... |
374 } | 374 } |
375 } | 375 } |
376 } | 376 } |
377 } | 377 } |
378 } | 378 } |
379 | 379 |
380 | 380 |
381 // A helper class for testing lowering of bitwise operators. | 381 // A helper class for testing lowering of bitwise operators. |
382 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester { | 382 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester { |
383 public: | 383 public: |
384 explicit JSBitwiseTypedLoweringTester(LanguageMode language_mode) | 384 explicit JSBitwiseTypedLoweringTester(Strength strength) |
385 : JSTypedLoweringTester(), language_mode_(language_mode) { | 385 : JSTypedLoweringTester(), strength_(strength) { |
386 int i = 0; | 386 int i = 0; |
387 set(i++, javascript.BitwiseOr(language_mode_), true); | 387 set(i++, javascript.BitwiseOr(strength_), true); |
388 set(i++, machine.Word32Or(), true); | 388 set(i++, machine.Word32Or(), true); |
389 set(i++, javascript.BitwiseXor(language_mode_), true); | 389 set(i++, javascript.BitwiseXor(strength_), true); |
390 set(i++, machine.Word32Xor(), true); | 390 set(i++, machine.Word32Xor(), true); |
391 set(i++, javascript.BitwiseAnd(language_mode_), true); | 391 set(i++, javascript.BitwiseAnd(strength_), true); |
392 set(i++, machine.Word32And(), true); | 392 set(i++, machine.Word32And(), true); |
393 } | 393 } |
394 static const int kNumberOps = 6; | 394 static const int kNumberOps = 6; |
395 const Operator* ops[kNumberOps]; | 395 const Operator* ops[kNumberOps]; |
396 bool signedness[kNumberOps]; | 396 bool signedness[kNumberOps]; |
397 | 397 |
398 private: | 398 private: |
399 LanguageMode language_mode_; | 399 Strength strength_; |
400 void set(int idx, const Operator* op, bool s) { | 400 void set(int idx, const Operator* op, bool s) { |
401 ops[idx] = op; | 401 ops[idx] = op; |
402 signedness[idx] = s; | 402 signedness[idx] = s; |
403 } | 403 } |
404 }; | 404 }; |
405 | 405 |
406 | 406 |
407 TEST(Int32BitwiseBinops) { | 407 TEST(Int32BitwiseBinops) { |
408 JSBitwiseTypedLoweringTester R(LanguageMode::SLOPPY); | 408 JSBitwiseTypedLoweringTester R(Strength::NORMAL); |
409 | 409 |
410 Type* types[] = { | 410 Type* types[] = { |
411 Type::SignedSmall(), Type::UnsignedSmall(), Type::Unsigned32(), | 411 Type::SignedSmall(), Type::UnsignedSmall(), Type::Unsigned32(), |
412 Type::Signed32(), Type::MinusZero(), Type::NaN(), | 412 Type::Signed32(), Type::MinusZero(), Type::NaN(), |
413 Type::OrderedNumber(), Type::PlainNumber(), Type::Undefined(), | 413 Type::OrderedNumber(), Type::PlainNumber(), Type::Undefined(), |
414 Type::Null(), Type::Boolean(), Type::Number(), | 414 Type::Null(), Type::Boolean(), Type::Number(), |
415 Type::String()}; | 415 Type::String()}; |
416 | 416 |
417 for (size_t i = 0; i < arraysize(types); ++i) { | 417 for (size_t i = 0; i < arraysize(types); ++i) { |
418 Node* p0 = R.Parameter(types[i], 0); | 418 Node* p0 = R.Parameter(types[i], 0); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode()); | 590 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode()); |
591 } | 591 } |
592 | 592 |
593 CHECK_EQ(n, add->InputAt(0)); | 593 CHECK_EQ(n, add->InputAt(0)); |
594 CHECK_EQ(r, add->InputAt(1)); | 594 CHECK_EQ(r, add->InputAt(1)); |
595 R.CheckEffectInput(R.start(), effect_use); | 595 R.CheckEffectInput(R.start(), effect_use); |
596 } | 596 } |
597 } | 597 } |
598 | 598 |
599 | 599 |
600 TEST_WITH_STRONG(StringComparison) { | 600 TEST_WITH_STRENGTH(StringComparison) { |
601 JSTypedLoweringTester R; | 601 JSTypedLoweringTester R; |
602 | 602 |
603 const Operator* ops[] = { | 603 const Operator* ops[] = { |
604 R.javascript.LessThan(language_mode), R.simplified.StringLessThan(), | 604 R.javascript.LessThan(strength), R.simplified.StringLessThan(), |
605 R.javascript.LessThanOrEqual(language_mode), | 605 R.javascript.LessThanOrEqual(strength), |
606 R.simplified.StringLessThanOrEqual(), | 606 R.simplified.StringLessThanOrEqual(), R.javascript.GreaterThan(strength), |
607 R.javascript.GreaterThan(language_mode), R.simplified.StringLessThan(), | 607 R.simplified.StringLessThan(), R.javascript.GreaterThanOrEqual(strength), |
608 R.javascript.GreaterThanOrEqual(language_mode), | |
609 R.simplified.StringLessThanOrEqual()}; | 608 R.simplified.StringLessThanOrEqual()}; |
610 | 609 |
611 for (size_t i = 0; i < arraysize(kStringTypes); i++) { | 610 for (size_t i = 0; i < arraysize(kStringTypes); i++) { |
612 Node* p0 = R.Parameter(kStringTypes[i], 0); | 611 Node* p0 = R.Parameter(kStringTypes[i], 0); |
613 for (size_t j = 0; j < arraysize(kStringTypes); j++) { | 612 for (size_t j = 0; j < arraysize(kStringTypes); j++) { |
614 Node* p1 = R.Parameter(kStringTypes[j], 1); | 613 Node* p1 = R.Parameter(kStringTypes[j], 1); |
615 | 614 |
616 for (size_t k = 0; k < arraysize(ops); k += 2) { | 615 for (size_t k = 0; k < arraysize(ops); k += 2) { |
617 Node* cmp = R.Binop(ops[k], p0, p1); | 616 Node* cmp = R.Binop(ops[k], p0, p1); |
618 Node* r = R.reduce(cmp); | 617 Node* r = R.reduce(cmp); |
(...skipping 21 matching lines...) Expand all Loading... |
640 CHECK_EQ(IrOpcode::kBooleanToNumber, converted->opcode()); | 639 CHECK_EQ(IrOpcode::kBooleanToNumber, converted->opcode()); |
641 CHECK_EQ(val, converted->InputAt(0)); | 640 CHECK_EQ(val, converted->InputAt(0)); |
642 } else { | 641 } else { |
643 if (converted->opcode() == IrOpcode::kNumberConstant) return; | 642 if (converted->opcode() == IrOpcode::kNumberConstant) return; |
644 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode()); | 643 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode()); |
645 CHECK_EQ(val, converted->InputAt(0)); | 644 CHECK_EQ(val, converted->InputAt(0)); |
646 } | 645 } |
647 } | 646 } |
648 | 647 |
649 | 648 |
650 TEST_WITH_STRONG(NumberComparison) { | 649 TEST_WITH_STRENGTH(NumberComparison) { |
651 JSTypedLoweringTester R; | 650 JSTypedLoweringTester R; |
652 | 651 |
653 const Operator* ops[] = { | 652 const Operator* ops[] = { |
654 R.javascript.LessThan(language_mode), R.simplified.NumberLessThan(), | 653 R.javascript.LessThan(strength), R.simplified.NumberLessThan(), |
655 R.javascript.LessThanOrEqual(language_mode), | 654 R.javascript.LessThanOrEqual(strength), |
656 R.simplified.NumberLessThanOrEqual(), | 655 R.simplified.NumberLessThanOrEqual(), R.javascript.GreaterThan(strength), |
657 R.javascript.GreaterThan(language_mode), R.simplified.NumberLessThan(), | 656 R.simplified.NumberLessThan(), R.javascript.GreaterThanOrEqual(strength), |
658 R.javascript.GreaterThanOrEqual(language_mode), | |
659 R.simplified.NumberLessThanOrEqual()}; | 657 R.simplified.NumberLessThanOrEqual()}; |
660 | 658 |
661 Node* const p0 = R.Parameter(Type::Number(), 0); | 659 Node* const p0 = R.Parameter(Type::Number(), 0); |
662 Node* const p1 = R.Parameter(Type::Number(), 1); | 660 Node* const p1 = R.Parameter(Type::Number(), 1); |
663 | 661 |
664 for (size_t k = 0; k < arraysize(ops); k += 2) { | 662 for (size_t k = 0; k < arraysize(ops); k += 2) { |
665 Node* cmp = R.Binop(ops[k], p0, p1); | 663 Node* cmp = R.Binop(ops[k], p0, p1); |
666 Node* r = R.reduce(cmp); | 664 Node* r = R.reduce(cmp); |
667 | 665 |
668 R.CheckPureBinop(ops[k + 1], r); | 666 R.CheckPureBinop(ops[k + 1], r); |
669 if (k >= 4) { | 667 if (k >= 4) { |
670 // GreaterThan and GreaterThanOrEqual commute the inputs | 668 // GreaterThan and GreaterThanOrEqual commute the inputs |
671 // and use the LessThan and LessThanOrEqual operators. | 669 // and use the LessThan and LessThanOrEqual operators. |
672 CheckIsConvertedToNumber(p1, r->InputAt(0)); | 670 CheckIsConvertedToNumber(p1, r->InputAt(0)); |
673 CheckIsConvertedToNumber(p0, r->InputAt(1)); | 671 CheckIsConvertedToNumber(p0, r->InputAt(1)); |
674 } else { | 672 } else { |
675 CheckIsConvertedToNumber(p0, r->InputAt(0)); | 673 CheckIsConvertedToNumber(p0, r->InputAt(0)); |
676 CheckIsConvertedToNumber(p1, r->InputAt(1)); | 674 CheckIsConvertedToNumber(p1, r->InputAt(1)); |
677 } | 675 } |
678 } | 676 } |
679 } | 677 } |
680 | 678 |
681 | 679 |
682 TEST_WITH_STRONG(MixedComparison1) { | 680 TEST_WITH_STRENGTH(MixedComparison1) { |
683 JSTypedLoweringTester R; | 681 JSTypedLoweringTester R; |
684 | 682 |
685 Type* types[] = {Type::Number(), Type::String(), | 683 Type* types[] = {Type::Number(), Type::String(), |
686 Type::Union(Type::Number(), Type::String(), R.main_zone())}; | 684 Type::Union(Type::Number(), Type::String(), R.main_zone())}; |
687 | 685 |
688 for (size_t i = 0; i < arraysize(types); i++) { | 686 for (size_t i = 0; i < arraysize(types); i++) { |
689 Node* p0 = R.Parameter(types[i], 0); | 687 Node* p0 = R.Parameter(types[i], 0); |
690 | 688 |
691 for (size_t j = 0; j < arraysize(types); j++) { | 689 for (size_t j = 0; j < arraysize(types); j++) { |
692 Node* p1 = R.Parameter(types[j], 1); | 690 Node* p1 = R.Parameter(types[j], 1); |
693 { | 691 { |
694 const Operator* less_than = R.javascript.LessThan(language_mode); | 692 const Operator* less_than = R.javascript.LessThan(strength); |
695 Node* cmp = R.Binop(less_than, p0, p1); | 693 Node* cmp = R.Binop(less_than, p0, p1); |
696 Node* r = R.reduce(cmp); | 694 Node* r = R.reduce(cmp); |
697 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) { | 695 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) { |
698 R.CheckPureBinop(R.simplified.StringLessThan(), r); | 696 R.CheckPureBinop(R.simplified.StringLessThan(), r); |
699 } else if ((types[i]->Is(Type::Number()) && | 697 } else if ((types[i]->Is(Type::Number()) && |
700 types[j]->Is(Type::Number())) || | 698 types[j]->Is(Type::Number())) || |
701 (!is_strong(language_mode) && | 699 (!is_strong(strength) && |
702 (!types[i]->Maybe(Type::String()) || | 700 (!types[i]->Maybe(Type::String()) || |
703 !types[j]->Maybe(Type::String())))) { | 701 !types[j]->Maybe(Type::String())))) { |
704 R.CheckPureBinop(R.simplified.NumberLessThan(), r); | 702 R.CheckPureBinop(R.simplified.NumberLessThan(), r); |
705 } else { | 703 } else { |
706 // No reduction of mixed types. | 704 // No reduction of mixed types. |
707 CHECK_EQ(r->op(), less_than); | 705 CHECK_EQ(r->op(), less_than); |
708 } | 706 } |
709 } | 707 } |
710 } | 708 } |
711 } | 709 } |
712 } | 710 } |
713 | 711 |
714 | 712 |
715 TEST_WITH_STRONG(RemoveToNumberEffects) { | 713 TEST_WITH_STRENGTH(RemoveToNumberEffects) { |
716 JSTypedLoweringTester R; | 714 JSTypedLoweringTester R; |
717 | 715 |
718 Node* effect_use = NULL; | 716 Node* effect_use = NULL; |
719 for (int i = 0; i < 10; i++) { | 717 for (int i = 0; i < 10; i++) { |
720 Node* p0 = R.Parameter(Type::Number()); | 718 Node* p0 = R.Parameter(Type::Number()); |
721 Node* ton = R.Unop(R.javascript.ToNumber(), p0); | 719 Node* ton = R.Unop(R.javascript.ToNumber(), p0); |
722 Node* frame_state = R.EmptyFrameState(R.context()); | 720 Node* frame_state = R.EmptyFrameState(R.context()); |
723 effect_use = NULL; | 721 effect_use = NULL; |
724 | 722 |
725 switch (i) { | 723 switch (i) { |
726 case 0: | 724 case 0: |
727 DCHECK(OperatorProperties::GetFrameStateInputCount( | 725 DCHECK(OperatorProperties::GetFrameStateInputCount( |
728 R.javascript.ToNumber()) == 1); | 726 R.javascript.ToNumber()) == 1); |
729 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(), | 727 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(), |
730 frame_state, ton, R.start()); | 728 frame_state, ton, R.start()); |
731 break; | 729 break; |
732 case 1: | 730 case 1: |
733 DCHECK(OperatorProperties::GetFrameStateInputCount( | 731 DCHECK(OperatorProperties::GetFrameStateInputCount( |
734 R.javascript.ToNumber()) == 1); | 732 R.javascript.ToNumber()) == 1); |
735 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), | 733 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), |
736 frame_state, ton, R.start()); | 734 frame_state, ton, R.start()); |
737 break; | 735 break; |
738 case 2: | 736 case 2: |
739 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); | 737 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); |
740 case 3: | 738 case 3: |
741 effect_use = R.graph.NewNode(R.javascript.Add(language_mode), ton, ton, | 739 effect_use = |
742 R.context(), frame_state, frame_state, ton, | 740 R.graph.NewNode(R.javascript.Add(strength), ton, ton, R.context(), |
743 R.start()); | 741 frame_state, frame_state, ton, R.start()); |
744 break; | 742 break; |
745 case 4: | 743 case 4: |
746 effect_use = R.graph.NewNode(R.javascript.Add(language_mode), p0, p0, | 744 effect_use = |
747 R.context(), frame_state, frame_state, ton, | 745 R.graph.NewNode(R.javascript.Add(strength), p0, p0, R.context(), |
748 R.start()); | 746 frame_state, frame_state, ton, R.start()); |
749 break; | 747 break; |
750 case 5: | 748 case 5: |
751 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); | 749 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); |
752 break; | 750 break; |
753 case 6: | 751 case 6: |
754 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); | 752 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); |
755 } | 753 } |
756 | 754 |
757 R.CheckEffectInput(R.start(), ton); | 755 R.CheckEffectInput(R.start(), ton); |
758 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); | 756 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 TEST(StringEquality) { | 894 TEST(StringEquality) { |
897 JSTypedLoweringTester R; | 895 JSTypedLoweringTester R; |
898 Node* p0 = R.Parameter(Type::String()); | 896 Node* p0 = R.Parameter(Type::String()); |
899 Node* p1 = R.Parameter(Type::String()); | 897 Node* p1 = R.Parameter(Type::String()); |
900 | 898 |
901 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual); | 899 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual); |
902 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual); | 900 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual); |
903 } | 901 } |
904 | 902 |
905 | 903 |
906 TEST_WITH_STRONG(RemovePureNumberBinopEffects) { | 904 TEST_WITH_STRENGTH(RemovePureNumberBinopEffects) { |
907 JSTypedLoweringTester R; | 905 JSTypedLoweringTester R; |
908 | 906 |
909 const Operator* ops[] = { | 907 const Operator* ops[] = { |
910 R.javascript.Equal(), R.simplified.NumberEqual(), | 908 R.javascript.Equal(), R.simplified.NumberEqual(), |
911 R.javascript.Add(language_mode), R.simplified.NumberAdd(), | 909 R.javascript.Add(strength), R.simplified.NumberAdd(), |
912 R.javascript.Subtract(language_mode), R.simplified.NumberSubtract(), | 910 R.javascript.Subtract(strength), R.simplified.NumberSubtract(), |
913 R.javascript.Multiply(language_mode), R.simplified.NumberMultiply(), | 911 R.javascript.Multiply(strength), R.simplified.NumberMultiply(), |
914 R.javascript.Divide(language_mode), R.simplified.NumberDivide(), | 912 R.javascript.Divide(strength), R.simplified.NumberDivide(), |
915 R.javascript.Modulus(language_mode), R.simplified.NumberModulus(), | 913 R.javascript.Modulus(strength), R.simplified.NumberModulus(), |
916 R.javascript.LessThan(language_mode), R.simplified.NumberLessThan(), | 914 R.javascript.LessThan(strength), R.simplified.NumberLessThan(), |
917 R.javascript.LessThanOrEqual(language_mode), | 915 R.javascript.LessThanOrEqual(strength), |
918 R.simplified.NumberLessThanOrEqual(), | 916 R.simplified.NumberLessThanOrEqual(), |
919 }; | 917 }; |
920 | 918 |
921 for (size_t j = 0; j < arraysize(ops); j += 2) { | 919 for (size_t j = 0; j < arraysize(ops); j += 2) { |
922 BinopEffectsTester B(ops[j], Type::Number(), Type::Number()); | 920 BinopEffectsTester B(ops[j], Type::Number(), Type::Number()); |
923 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 921 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
924 | 922 |
925 B.R.CheckPureBinop(B.result->opcode(), B.result); | 923 B.R.CheckPureBinop(B.result->opcode(), B.result); |
926 | 924 |
927 B.CheckNoOp(0); | 925 B.CheckNoOp(0); |
928 B.CheckNoOp(1); | 926 B.CheckNoOp(1); |
929 | 927 |
930 B.CheckEffectsRemoved(); | 928 B.CheckEffectsRemoved(); |
931 } | 929 } |
932 } | 930 } |
933 | 931 |
934 | 932 |
935 TEST(OrderNumberBinopEffects1) { | 933 TEST(OrderNumberBinopEffects1) { |
936 JSTypedLoweringTester R; | 934 JSTypedLoweringTester R; |
937 | 935 |
938 const Operator* ops[] = { | 936 const Operator* ops[] = { |
939 R.javascript.Subtract(LanguageMode::SLOPPY), | 937 R.javascript.Subtract(Strength::NORMAL), R.simplified.NumberSubtract(), |
940 R.simplified.NumberSubtract(), | 938 R.javascript.Multiply(Strength::NORMAL), R.simplified.NumberMultiply(), |
941 R.javascript.Multiply(LanguageMode::SLOPPY), | 939 R.javascript.Divide(Strength::NORMAL), R.simplified.NumberDivide()}; |
942 R.simplified.NumberMultiply(), | |
943 R.javascript.Divide(LanguageMode::SLOPPY), | |
944 R.simplified.NumberDivide(), | |
945 }; | |
946 | 940 |
947 for (size_t j = 0; j < arraysize(ops); j += 2) { | 941 for (size_t j = 0; j < arraysize(ops); j += 2) { |
948 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol()); | 942 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol()); |
949 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 943 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
950 | 944 |
951 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); | 945 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); |
952 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 946 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
953 | 947 |
954 CHECK_EQ(B.p0, i0->InputAt(0)); | 948 CHECK_EQ(B.p0, i0->InputAt(0)); |
955 CHECK_EQ(B.p1, i1->InputAt(0)); | 949 CHECK_EQ(B.p1, i1->InputAt(0)); |
956 | 950 |
957 // Effects should be ordered start -> i0 -> i1 -> effect_use | 951 // Effects should be ordered start -> i0 -> i1 -> effect_use |
958 B.CheckEffectOrdering(i0, i1); | 952 B.CheckEffectOrdering(i0, i1); |
959 } | 953 } |
960 } | 954 } |
961 | 955 |
962 | 956 |
963 TEST(OrderNumberBinopEffects2) { | 957 TEST(OrderNumberBinopEffects2) { |
964 JSTypedLoweringTester R; | 958 JSTypedLoweringTester R; |
965 | 959 |
966 const Operator* ops[] = { | 960 const Operator* ops[] = { |
967 R.javascript.Add(LanguageMode::SLOPPY), | 961 R.javascript.Add(Strength::NORMAL), R.simplified.NumberAdd(), |
968 R.simplified.NumberAdd(), | 962 R.javascript.Subtract(Strength::NORMAL), R.simplified.NumberSubtract(), |
969 R.javascript.Subtract(LanguageMode::SLOPPY), | 963 R.javascript.Multiply(Strength::NORMAL), R.simplified.NumberMultiply(), |
970 R.simplified.NumberSubtract(), | 964 R.javascript.Divide(Strength::NORMAL), R.simplified.NumberDivide()}; |
971 R.javascript.Multiply(LanguageMode::SLOPPY), | |
972 R.simplified.NumberMultiply(), | |
973 R.javascript.Divide(LanguageMode::SLOPPY), | |
974 R.simplified.NumberDivide(), | |
975 }; | |
976 | 965 |
977 for (size_t j = 0; j < arraysize(ops); j += 2) { | 966 for (size_t j = 0; j < arraysize(ops); j += 2) { |
978 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol()); | 967 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol()); |
979 | 968 |
980 Node* i0 = B.CheckNoOp(0); | 969 Node* i0 = B.CheckNoOp(0); |
981 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 970 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
982 | 971 |
983 CHECK_EQ(B.p0, i0); | 972 CHECK_EQ(B.p0, i0); |
984 CHECK_EQ(B.p1, i1->InputAt(0)); | 973 CHECK_EQ(B.p1, i1->InputAt(0)); |
985 | 974 |
(...skipping 13 matching lines...) Expand all Loading... |
999 // Effects should be ordered start -> i0 -> effect_use | 988 // Effects should be ordered start -> i0 -> effect_use |
1000 B.CheckEffectOrdering(i0); | 989 B.CheckEffectOrdering(i0); |
1001 } | 990 } |
1002 } | 991 } |
1003 | 992 |
1004 | 993 |
1005 TEST(OrderCompareEffects) { | 994 TEST(OrderCompareEffects) { |
1006 JSTypedLoweringTester R; | 995 JSTypedLoweringTester R; |
1007 | 996 |
1008 const Operator* ops[] = { | 997 const Operator* ops[] = { |
1009 R.javascript.GreaterThan(LanguageMode::SLOPPY), | 998 R.javascript.GreaterThan(Strength::NORMAL), R.simplified.NumberLessThan(), |
1010 R.simplified.NumberLessThan(), | 999 R.javascript.GreaterThanOrEqual(Strength::NORMAL), |
1011 R.javascript.GreaterThanOrEqual(LanguageMode::SLOPPY), | |
1012 R.simplified.NumberLessThanOrEqual(), | 1000 R.simplified.NumberLessThanOrEqual(), |
1013 }; | 1001 }; |
1014 | 1002 |
1015 for (size_t j = 0; j < arraysize(ops); j += 2) { | 1003 for (size_t j = 0; j < arraysize(ops); j += 2) { |
1016 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String()); | 1004 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String()); |
1017 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 1005 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
1018 | 1006 |
1019 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); | 1007 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); |
1020 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 1008 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
1021 | 1009 |
(...skipping 27 matching lines...) Expand all Loading... |
1049 CHECK_EQ(B.p1, i0); // Should be commuted. | 1037 CHECK_EQ(B.p1, i0); // Should be commuted. |
1050 CHECK_EQ(B.p0, i1->InputAt(0)); | 1038 CHECK_EQ(B.p0, i1->InputAt(0)); |
1051 | 1039 |
1052 // Effects should be ordered start -> i0 -> effect_use | 1040 // Effects should be ordered start -> i0 -> effect_use |
1053 B.CheckEffectOrdering(i1); | 1041 B.CheckEffectOrdering(i1); |
1054 } | 1042 } |
1055 } | 1043 } |
1056 | 1044 |
1057 | 1045 |
1058 TEST(Int32BinopEffects) { | 1046 TEST(Int32BinopEffects) { |
1059 JSBitwiseTypedLoweringTester R(LanguageMode::SLOPPY); | 1047 JSBitwiseTypedLoweringTester R(Strength::NORMAL); |
1060 for (int j = 0; j < R.kNumberOps; j += 2) { | 1048 for (int j = 0; j < R.kNumberOps; j += 2) { |
1061 bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1]; | 1049 bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1]; |
1062 BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right)); | 1050 BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right)); |
1063 CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode()); | 1051 CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode()); |
1064 | 1052 |
1065 B.R.CheckPureBinop(B.result->opcode(), B.result); | 1053 B.R.CheckPureBinop(B.result->opcode(), B.result); |
1066 | 1054 |
1067 B.CheckNoOp(0); | 1055 B.CheckNoOp(0); |
1068 B.CheckNoOp(1); | 1056 B.CheckNoOp(1); |
1069 | 1057 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true); | 1118 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true); |
1131 | 1119 |
1132 CHECK_EQ(B.p0, ii0->InputAt(0)); | 1120 CHECK_EQ(B.p0, ii0->InputAt(0)); |
1133 CHECK_EQ(B.p1, ii1->InputAt(0)); | 1121 CHECK_EQ(B.p1, ii1->InputAt(0)); |
1134 | 1122 |
1135 B.CheckEffectOrdering(ii0, ii1); | 1123 B.CheckEffectOrdering(ii0, ii1); |
1136 } | 1124 } |
1137 } | 1125 } |
1138 | 1126 |
1139 | 1127 |
1140 TEST_WITH_STRONG(Int32AddNarrowing) { | 1128 TEST_WITH_STRENGTH(Int32AddNarrowing) { |
1141 { | 1129 { |
1142 JSBitwiseTypedLoweringTester R(language_mode); | 1130 JSBitwiseTypedLoweringTester R(strength); |
1143 | 1131 |
1144 for (int o = 0; o < R.kNumberOps; o += 2) { | 1132 for (int o = 0; o < R.kNumberOps; o += 2) { |
1145 for (size_t i = 0; i < arraysize(kInt32Types); i++) { | 1133 for (size_t i = 0; i < arraysize(kInt32Types); i++) { |
1146 Node* n0 = R.Parameter(kInt32Types[i]); | 1134 Node* n0 = R.Parameter(kInt32Types[i]); |
1147 for (size_t j = 0; j < arraysize(kInt32Types); j++) { | 1135 for (size_t j = 0; j < arraysize(kInt32Types); j++) { |
1148 Node* n1 = R.Parameter(kInt32Types[j]); | 1136 Node* n1 = R.Parameter(kInt32Types[j]); |
1149 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); | 1137 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); |
1150 | 1138 |
1151 for (int l = 0; l < 2; l++) { | 1139 for (int l = 0; l < 2; l++) { |
1152 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); | 1140 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); |
1153 Node* or_node = | 1141 Node* or_node = |
1154 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); | 1142 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); |
1155 Node* r = R.reduce(or_node); | 1143 Node* r = R.reduce(or_node); |
1156 | 1144 |
1157 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); | 1145 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); |
1158 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); | 1146 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); |
1159 } | 1147 } |
1160 } | 1148 } |
1161 } | 1149 } |
1162 } | 1150 } |
1163 } | 1151 } |
1164 { | 1152 { |
1165 JSBitwiseShiftTypedLoweringTester R(language_mode); | 1153 JSBitwiseShiftTypedLoweringTester R(strength); |
1166 | 1154 |
1167 for (int o = 0; o < R.kNumberOps; o += 2) { | 1155 for (int o = 0; o < R.kNumberOps; o += 2) { |
1168 for (size_t i = 0; i < arraysize(kInt32Types); i++) { | 1156 for (size_t i = 0; i < arraysize(kInt32Types); i++) { |
1169 Node* n0 = R.Parameter(kInt32Types[i]); | 1157 Node* n0 = R.Parameter(kInt32Types[i]); |
1170 for (size_t j = 0; j < arraysize(kInt32Types); j++) { | 1158 for (size_t j = 0; j < arraysize(kInt32Types); j++) { |
1171 Node* n1 = R.Parameter(kInt32Types[j]); | 1159 Node* n1 = R.Parameter(kInt32Types[j]); |
1172 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); | 1160 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); |
1173 | 1161 |
1174 for (int l = 0; l < 2; l++) { | 1162 for (int l = 0; l < 2; l++) { |
1175 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); | 1163 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); |
1176 Node* or_node = | 1164 Node* or_node = |
1177 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); | 1165 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); |
1178 Node* r = R.reduce(or_node); | 1166 Node* r = R.reduce(or_node); |
1179 | 1167 |
1180 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); | 1168 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); |
1181 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); | 1169 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); |
1182 } | 1170 } |
1183 } | 1171 } |
1184 } | 1172 } |
1185 } | 1173 } |
1186 } | 1174 } |
1187 { | 1175 { |
1188 JSBitwiseTypedLoweringTester R(language_mode); | 1176 JSBitwiseTypedLoweringTester R(strength); |
1189 | 1177 |
1190 for (int o = 0; o < R.kNumberOps; o += 2) { | 1178 for (int o = 0; o < R.kNumberOps; o += 2) { |
1191 Node* n0 = R.Parameter(I32Type(R.signedness[o])); | 1179 Node* n0 = R.Parameter(I32Type(R.signedness[o])); |
1192 Node* n1 = R.Parameter(I32Type(R.signedness[o + 1])); | 1180 Node* n1 = R.Parameter(I32Type(R.signedness[o + 1])); |
1193 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); | 1181 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); |
1194 | 1182 |
1195 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); | 1183 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); |
1196 Node* or_node = R.Binop(R.ops[o], add_node, one); | 1184 Node* or_node = R.Binop(R.ops[o], add_node, one); |
1197 Node* other_use = R.Binop(R.simplified.NumberAdd(), add_node, one); | 1185 Node* other_use = R.Binop(R.simplified.NumberAdd(), add_node, one); |
1198 Node* r = R.reduce(or_node); | 1186 Node* r = R.reduce(or_node); |
1199 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); | 1187 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); |
1200 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); | 1188 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); |
1201 // Conversion to int32 should be done. | 1189 // Conversion to int32 should be done. |
1202 CheckToI32(add_node, r->InputAt(0), R.signedness[o]); | 1190 CheckToI32(add_node, r->InputAt(0), R.signedness[o]); |
1203 CheckToI32(one, r->InputAt(1), R.signedness[o + 1]); | 1191 CheckToI32(one, r->InputAt(1), R.signedness[o + 1]); |
1204 // The other use should also not be touched. | 1192 // The other use should also not be touched. |
1205 CHECK_EQ(add_node, other_use->InputAt(0)); | 1193 CHECK_EQ(add_node, other_use->InputAt(0)); |
1206 CHECK_EQ(one, other_use->InputAt(1)); | 1194 CHECK_EQ(one, other_use->InputAt(1)); |
1207 } | 1195 } |
1208 } | 1196 } |
1209 } | 1197 } |
1210 | 1198 |
1211 | 1199 |
1212 TEST_WITH_STRONG(Int32Comparisons) { | 1200 TEST_WITH_STRENGTH(Int32Comparisons) { |
1213 JSTypedLoweringTester R; | 1201 JSTypedLoweringTester R; |
1214 | 1202 |
1215 struct Entry { | 1203 struct Entry { |
1216 const Operator* js_op; | 1204 const Operator* js_op; |
1217 const Operator* uint_op; | 1205 const Operator* uint_op; |
1218 const Operator* int_op; | 1206 const Operator* int_op; |
1219 const Operator* num_op; | 1207 const Operator* num_op; |
1220 bool commute; | 1208 bool commute; |
1221 }; | 1209 }; |
1222 | 1210 |
1223 Entry ops[] = { | 1211 Entry ops[] = { |
1224 {R.javascript.LessThan(language_mode), R.machine.Uint32LessThan(), | 1212 {R.javascript.LessThan(strength), R.machine.Uint32LessThan(), |
1225 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false}, | 1213 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false}, |
1226 {R.javascript.LessThanOrEqual(language_mode), | 1214 {R.javascript.LessThanOrEqual(strength), |
1227 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), | 1215 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), |
1228 R.simplified.NumberLessThanOrEqual(), false}, | 1216 R.simplified.NumberLessThanOrEqual(), false}, |
1229 {R.javascript.GreaterThan(language_mode), R.machine.Uint32LessThan(), | 1217 {R.javascript.GreaterThan(strength), R.machine.Uint32LessThan(), |
1230 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true}, | 1218 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true}, |
1231 {R.javascript.GreaterThanOrEqual(language_mode), | 1219 {R.javascript.GreaterThanOrEqual(strength), |
1232 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), | 1220 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), |
1233 R.simplified.NumberLessThanOrEqual(), true} | 1221 R.simplified.NumberLessThanOrEqual(), true}}; |
1234 }; | |
1235 | 1222 |
1236 for (size_t o = 0; o < arraysize(ops); o++) { | 1223 for (size_t o = 0; o < arraysize(ops); o++) { |
1237 for (size_t i = 0; i < arraysize(kNumberTypes); i++) { | 1224 for (size_t i = 0; i < arraysize(kNumberTypes); i++) { |
1238 Type* t0 = kNumberTypes[i]; | 1225 Type* t0 = kNumberTypes[i]; |
1239 Node* p0 = R.Parameter(t0, 0); | 1226 Node* p0 = R.Parameter(t0, 0); |
1240 | 1227 |
1241 for (size_t j = 0; j < arraysize(kNumberTypes); j++) { | 1228 for (size_t j = 0; j < arraysize(kNumberTypes); j++) { |
1242 Type* t1 = kNumberTypes[j]; | 1229 Type* t1 = kNumberTypes[j]; |
1243 Node* p1 = R.Parameter(t1, 1); | 1230 Node* p1 = R.Parameter(t1, 1); |
1244 | 1231 |
(...skipping 13 matching lines...) Expand all Loading... |
1258 CHECK_EQ(p1, r->InputAt(0)); | 1245 CHECK_EQ(p1, r->InputAt(0)); |
1259 CHECK_EQ(p0, r->InputAt(1)); | 1246 CHECK_EQ(p0, r->InputAt(1)); |
1260 } else { | 1247 } else { |
1261 CHECK_EQ(p0, r->InputAt(0)); | 1248 CHECK_EQ(p0, r->InputAt(0)); |
1262 CHECK_EQ(p1, r->InputAt(1)); | 1249 CHECK_EQ(p1, r->InputAt(1)); |
1263 } | 1250 } |
1264 } | 1251 } |
1265 } | 1252 } |
1266 } | 1253 } |
1267 } | 1254 } |
OLD | NEW |