| 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 |