| 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/compilation-dependencies.h" | 5 #include "src/compilation-dependencies.h" |
| 6 #include "src/compiler/js-graph.h" | 6 #include "src/compiler/js-graph.h" |
| 7 #include "src/compiler/js-typed-lowering.h" | 7 #include "src/compiler/js-typed-lowering.h" |
| 8 #include "src/compiler/machine-operator.h" | 8 #include "src/compiler/machine-operator.h" |
| 9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
| 10 #include "src/compiler/opcodes.h" | 10 #include "src/compiler/opcodes.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 const Operator* binop; | 40 const Operator* binop; |
| 41 const Operator* unop; | 41 const Operator* unop; |
| 42 JSOperatorBuilder javascript; | 42 JSOperatorBuilder javascript; |
| 43 MachineOperatorBuilder machine; | 43 MachineOperatorBuilder machine; |
| 44 SimplifiedOperatorBuilder simplified; | 44 SimplifiedOperatorBuilder simplified; |
| 45 CommonOperatorBuilder common; | 45 CommonOperatorBuilder common; |
| 46 CompilationDependencies deps; | 46 CompilationDependencies deps; |
| 47 Graph graph; | 47 Graph graph; |
| 48 Typer typer; | 48 Typer typer; |
| 49 Node* context_node; | 49 Node* context_node; |
| 50 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 50 BinaryOperationHints const binop_hints = BinaryOperationHints::Any(); |
| 51 CompareOperationHints const compare_hints = CompareOperationHints::Any(); |
| 51 | 52 |
| 52 Node* Parameter(Type* t, int32_t index = 0) { | 53 Node* Parameter(Type* t, int32_t index = 0) { |
| 53 Node* n = graph.NewNode(common.Parameter(index), graph.start()); | 54 Node* n = graph.NewNode(common.Parameter(index), graph.start()); |
| 54 NodeProperties::SetType(n, t); | 55 NodeProperties::SetType(n, t); |
| 55 return n; | 56 return n; |
| 56 } | 57 } |
| 57 | 58 |
| 58 Node* UndefinedConstant() { | 59 Node* UndefinedConstant() { |
| 59 Handle<HeapObject> value = isolate->factory()->undefined_value(); | 60 Handle<HeapObject> value = isolate->factory()->undefined_value(); |
| 60 return graph.NewNode(common.HeapConstant(value)); | 61 return graph.NewNode(common.HeapConstant(value)); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 | 249 |
| 249 R.CheckBinop(IrOpcode::kNumberAdd, r); | 250 R.CheckBinop(IrOpcode::kNumberAdd, r); |
| 250 CHECK_EQ(p0, r->InputAt(0)); | 251 CHECK_EQ(p0, r->InputAt(0)); |
| 251 CHECK_EQ(p1, r->InputAt(1)); | 252 CHECK_EQ(p1, r->InputAt(1)); |
| 252 } | 253 } |
| 253 } | 254 } |
| 254 | 255 |
| 255 TEST(NumberBinops) { | 256 TEST(NumberBinops) { |
| 256 JSTypedLoweringTester R; | 257 JSTypedLoweringTester R; |
| 257 const Operator* ops[] = { | 258 const Operator* ops[] = { |
| 258 R.javascript.Add(R.hints), R.simplified.NumberAdd(), | 259 R.javascript.Add(R.binop_hints), R.simplified.NumberAdd(), |
| 259 R.javascript.Subtract(R.hints), R.simplified.NumberSubtract(), | 260 R.javascript.Subtract(R.binop_hints), R.simplified.NumberSubtract(), |
| 260 R.javascript.Multiply(R.hints), R.simplified.NumberMultiply(), | 261 R.javascript.Multiply(R.binop_hints), R.simplified.NumberMultiply(), |
| 261 R.javascript.Divide(R.hints), R.simplified.NumberDivide(), | 262 R.javascript.Divide(R.binop_hints), R.simplified.NumberDivide(), |
| 262 R.javascript.Modulus(R.hints), R.simplified.NumberModulus(), | 263 R.javascript.Modulus(R.binop_hints), R.simplified.NumberModulus(), |
| 263 }; | 264 }; |
| 264 | 265 |
| 265 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { | 266 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { |
| 266 Node* p0 = R.Parameter(kNumberTypes[i], 0); | 267 Node* p0 = R.Parameter(kNumberTypes[i], 0); |
| 267 | 268 |
| 268 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) { | 269 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) { |
| 269 Node* p1 = R.Parameter(kNumberTypes[j], 1); | 270 Node* p1 = R.Parameter(kNumberTypes[j], 1); |
| 270 | 271 |
| 271 for (size_t k = 0; k < arraysize(ops); k += 2) { | 272 for (size_t k = 0; k < arraysize(ops); k += 2) { |
| 272 Node* add = R.Binop(ops[k], p0, p1); | 273 Node* add = R.Binop(ops[k], p0, p1); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 294 CHECK_EQ(e, v); | 295 CHECK_EQ(e, v); |
| 295 } | 296 } |
| 296 } | 297 } |
| 297 | 298 |
| 298 | 299 |
| 299 // A helper class for testing lowering of bitwise shift operators. | 300 // A helper class for testing lowering of bitwise shift operators. |
| 300 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester { | 301 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester { |
| 301 public: | 302 public: |
| 302 JSBitwiseShiftTypedLoweringTester() : JSTypedLoweringTester() { | 303 JSBitwiseShiftTypedLoweringTester() : JSTypedLoweringTester() { |
| 303 int i = 0; | 304 int i = 0; |
| 304 set(i++, javascript.ShiftLeft(hints), true); | 305 set(i++, javascript.ShiftLeft(binop_hints), true); |
| 305 set(i++, simplified.NumberShiftLeft(), false); | 306 set(i++, simplified.NumberShiftLeft(), false); |
| 306 set(i++, javascript.ShiftRight(hints), true); | 307 set(i++, javascript.ShiftRight(binop_hints), true); |
| 307 set(i++, simplified.NumberShiftRight(), false); | 308 set(i++, simplified.NumberShiftRight(), false); |
| 308 set(i++, javascript.ShiftRightLogical(hints), false); | 309 set(i++, javascript.ShiftRightLogical(binop_hints), false); |
| 309 set(i++, simplified.NumberShiftRightLogical(), false); | 310 set(i++, simplified.NumberShiftRightLogical(), false); |
| 310 } | 311 } |
| 311 static const int kNumberOps = 6; | 312 static const int kNumberOps = 6; |
| 312 const Operator* ops[kNumberOps]; | 313 const Operator* ops[kNumberOps]; |
| 313 bool signedness[kNumberOps]; | 314 bool signedness[kNumberOps]; |
| 314 | 315 |
| 315 private: | 316 private: |
| 316 void set(int idx, const Operator* op, bool s) { | 317 void set(int idx, const Operator* op, bool s) { |
| 317 ops[idx] = op; | 318 ops[idx] = op; |
| 318 signedness[idx] = s; | 319 signedness[idx] = s; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 } | 351 } |
| 351 } | 352 } |
| 352 } | 353 } |
| 353 | 354 |
| 354 | 355 |
| 355 // A helper class for testing lowering of bitwise operators. | 356 // A helper class for testing lowering of bitwise operators. |
| 356 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester { | 357 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester { |
| 357 public: | 358 public: |
| 358 JSBitwiseTypedLoweringTester() : JSTypedLoweringTester() { | 359 JSBitwiseTypedLoweringTester() : JSTypedLoweringTester() { |
| 359 int i = 0; | 360 int i = 0; |
| 360 set(i++, javascript.BitwiseOr(hints), true); | 361 set(i++, javascript.BitwiseOr(binop_hints), true); |
| 361 set(i++, simplified.NumberBitwiseOr(), true); | 362 set(i++, simplified.NumberBitwiseOr(), true); |
| 362 set(i++, javascript.BitwiseXor(hints), true); | 363 set(i++, javascript.BitwiseXor(binop_hints), true); |
| 363 set(i++, simplified.NumberBitwiseXor(), true); | 364 set(i++, simplified.NumberBitwiseXor(), true); |
| 364 set(i++, javascript.BitwiseAnd(hints), true); | 365 set(i++, javascript.BitwiseAnd(binop_hints), true); |
| 365 set(i++, simplified.NumberBitwiseAnd(), true); | 366 set(i++, simplified.NumberBitwiseAnd(), true); |
| 366 } | 367 } |
| 367 static const int kNumberOps = 6; | 368 static const int kNumberOps = 6; |
| 368 const Operator* ops[kNumberOps]; | 369 const Operator* ops[kNumberOps]; |
| 369 bool signedness[kNumberOps]; | 370 bool signedness[kNumberOps]; |
| 370 | 371 |
| 371 private: | 372 private: |
| 372 void set(int idx, const Operator* op, bool s) { | 373 void set(int idx, const Operator* op, bool s) { |
| 373 ops[idx] = op; | 374 ops[idx] = op; |
| 374 signedness[idx] = s; | 375 signedness[idx] = s; |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 CHECK_EQ(n, add->InputAt(0)); | 565 CHECK_EQ(n, add->InputAt(0)); |
| 565 CHECK_EQ(r, add->InputAt(1)); | 566 CHECK_EQ(r, add->InputAt(1)); |
| 566 R.CheckEffectInput(R.start(), effect_use); | 567 R.CheckEffectInput(R.start(), effect_use); |
| 567 } | 568 } |
| 568 } | 569 } |
| 569 | 570 |
| 570 TEST(StringComparison) { | 571 TEST(StringComparison) { |
| 571 JSTypedLoweringTester R; | 572 JSTypedLoweringTester R; |
| 572 | 573 |
| 573 const Operator* ops[] = { | 574 const Operator* ops[] = { |
| 574 R.javascript.LessThan(), R.simplified.StringLessThan(), | 575 R.javascript.LessThan(CompareOperationHints::Any()), |
| 575 R.javascript.LessThanOrEqual(), R.simplified.StringLessThanOrEqual(), | 576 R.simplified.StringLessThan(), |
| 576 R.javascript.GreaterThan(), R.simplified.StringLessThan(), | 577 R.javascript.LessThanOrEqual(CompareOperationHints::Any()), |
| 577 R.javascript.GreaterThanOrEqual(), R.simplified.StringLessThanOrEqual()}; | 578 R.simplified.StringLessThanOrEqual(), |
| 579 R.javascript.GreaterThan(CompareOperationHints::Any()), |
| 580 R.simplified.StringLessThan(), |
| 581 R.javascript.GreaterThanOrEqual(CompareOperationHints::Any()), |
| 582 R.simplified.StringLessThanOrEqual()}; |
| 578 | 583 |
| 579 for (size_t i = 0; i < arraysize(kStringTypes); i++) { | 584 for (size_t i = 0; i < arraysize(kStringTypes); i++) { |
| 580 Node* p0 = R.Parameter(kStringTypes[i], 0); | 585 Node* p0 = R.Parameter(kStringTypes[i], 0); |
| 581 for (size_t j = 0; j < arraysize(kStringTypes); j++) { | 586 for (size_t j = 0; j < arraysize(kStringTypes); j++) { |
| 582 Node* p1 = R.Parameter(kStringTypes[j], 1); | 587 Node* p1 = R.Parameter(kStringTypes[j], 1); |
| 583 | 588 |
| 584 for (size_t k = 0; k < arraysize(ops); k += 2) { | 589 for (size_t k = 0; k < arraysize(ops); k += 2) { |
| 585 Node* cmp = R.Binop(ops[k], p0, p1); | 590 Node* cmp = R.Binop(ops[k], p0, p1); |
| 586 Node* r = R.reduce(cmp); | 591 Node* r = R.reduce(cmp); |
| 587 | 592 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 611 if (converted->opcode() == IrOpcode::kNumberConstant) return; | 616 if (converted->opcode() == IrOpcode::kNumberConstant) return; |
| 612 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode()); | 617 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode()); |
| 613 CHECK_EQ(val, converted->InputAt(0)); | 618 CHECK_EQ(val, converted->InputAt(0)); |
| 614 } | 619 } |
| 615 } | 620 } |
| 616 | 621 |
| 617 TEST(NumberComparison) { | 622 TEST(NumberComparison) { |
| 618 JSTypedLoweringTester R; | 623 JSTypedLoweringTester R; |
| 619 | 624 |
| 620 const Operator* ops[] = { | 625 const Operator* ops[] = { |
| 621 R.javascript.LessThan(), R.simplified.NumberLessThan(), | 626 R.javascript.LessThan(CompareOperationHints::Any()), |
| 622 R.javascript.LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 627 R.simplified.NumberLessThan(), |
| 623 R.javascript.GreaterThan(), R.simplified.NumberLessThan(), | 628 R.javascript.LessThanOrEqual(CompareOperationHints::Any()), |
| 624 R.javascript.GreaterThanOrEqual(), R.simplified.NumberLessThanOrEqual()}; | 629 R.simplified.NumberLessThanOrEqual(), |
| 630 R.javascript.GreaterThan(CompareOperationHints::Any()), |
| 631 R.simplified.NumberLessThan(), |
| 632 R.javascript.GreaterThanOrEqual(CompareOperationHints::Any()), |
| 633 R.simplified.NumberLessThanOrEqual()}; |
| 625 | 634 |
| 626 Node* const p0 = R.Parameter(Type::Number(), 0); | 635 Node* const p0 = R.Parameter(Type::Number(), 0); |
| 627 Node* const p1 = R.Parameter(Type::Number(), 1); | 636 Node* const p1 = R.Parameter(Type::Number(), 1); |
| 628 | 637 |
| 629 for (size_t k = 0; k < arraysize(ops); k += 2) { | 638 for (size_t k = 0; k < arraysize(ops); k += 2) { |
| 630 Node* cmp = R.Binop(ops[k], p0, p1); | 639 Node* cmp = R.Binop(ops[k], p0, p1); |
| 631 Node* r = R.reduce(cmp); | 640 Node* r = R.reduce(cmp); |
| 632 | 641 |
| 633 R.CheckBinop(ops[k + 1], r); | 642 R.CheckBinop(ops[k + 1], r); |
| 634 if (k >= 4) { | 643 if (k >= 4) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 648 | 657 |
| 649 Type* types[] = {Type::Number(), Type::String(), | 658 Type* types[] = {Type::Number(), Type::String(), |
| 650 Type::Union(Type::Number(), Type::String(), R.main_zone())}; | 659 Type::Union(Type::Number(), Type::String(), R.main_zone())}; |
| 651 | 660 |
| 652 for (size_t i = 0; i < arraysize(types); i++) { | 661 for (size_t i = 0; i < arraysize(types); i++) { |
| 653 Node* p0 = R.Parameter(types[i], 0); | 662 Node* p0 = R.Parameter(types[i], 0); |
| 654 | 663 |
| 655 for (size_t j = 0; j < arraysize(types); j++) { | 664 for (size_t j = 0; j < arraysize(types); j++) { |
| 656 Node* p1 = R.Parameter(types[j], 1); | 665 Node* p1 = R.Parameter(types[j], 1); |
| 657 { | 666 { |
| 658 const Operator* less_than = R.javascript.LessThan(); | 667 const Operator* less_than = |
| 668 R.javascript.LessThan(CompareOperationHints::Any()); |
| 659 Node* cmp = R.Binop(less_than, p0, p1); | 669 Node* cmp = R.Binop(less_than, p0, p1); |
| 660 Node* r = R.reduce(cmp); | 670 Node* r = R.reduce(cmp); |
| 661 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) { | 671 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) { |
| 662 R.CheckBinop(R.simplified.StringLessThan(), r); | 672 R.CheckBinop(R.simplified.StringLessThan(), r); |
| 663 } else if ((types[i]->Is(Type::Number()) && | 673 } else if ((types[i]->Is(Type::Number()) && |
| 664 types[j]->Is(Type::Number())) || | 674 types[j]->Is(Type::Number())) || |
| 665 (!types[i]->Maybe(Type::String()) || | 675 (!types[i]->Maybe(Type::String()) || |
| 666 !types[j]->Maybe(Type::String()))) { | 676 !types[j]->Maybe(Type::String()))) { |
| 667 R.CheckBinop(R.simplified.NumberLessThan(), r); | 677 R.CheckBinop(R.simplified.NumberLessThan(), r); |
| 668 } else { | 678 } else { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 693 break; | 703 break; |
| 694 case 1: | 704 case 1: |
| 695 CHECK_EQ(1, OperatorProperties::GetFrameStateInputCount( | 705 CHECK_EQ(1, OperatorProperties::GetFrameStateInputCount( |
| 696 R.javascript.ToNumber())); | 706 R.javascript.ToNumber())); |
| 697 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), | 707 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), |
| 698 frame_state, ton, R.start()); | 708 frame_state, ton, R.start()); |
| 699 break; | 709 break; |
| 700 case 2: | 710 case 2: |
| 701 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); | 711 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); |
| 702 case 3: | 712 case 3: |
| 703 effect_use = | 713 effect_use = R.graph.NewNode(R.javascript.Add(R.binop_hints), ton, ton, |
| 704 R.graph.NewNode(R.javascript.Add(R.hints), ton, ton, R.context(), | 714 R.context(), frame_state, frame_state, ton, |
| 705 frame_state, frame_state, ton, R.start()); | 715 R.start()); |
| 706 break; | 716 break; |
| 707 case 4: | 717 case 4: |
| 708 effect_use = | 718 effect_use = R.graph.NewNode(R.javascript.Add(R.binop_hints), p0, p0, |
| 709 R.graph.NewNode(R.javascript.Add(R.hints), p0, p0, R.context(), | 719 R.context(), frame_state, frame_state, ton, |
| 710 frame_state, frame_state, ton, R.start()); | 720 R.start()); |
| 711 break; | 721 break; |
| 712 case 5: | 722 case 5: |
| 713 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); | 723 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); |
| 714 break; | 724 break; |
| 715 case 6: | 725 case 6: |
| 716 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); | 726 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); |
| 717 } | 727 } |
| 718 | 728 |
| 719 R.CheckEffectInput(R.start(), ton); | 729 R.CheckEffectInput(R.start(), ton); |
| 720 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); | 730 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 | 804 |
| 795 // Helper function for strict and non-strict equality reductions. | 805 // Helper function for strict and non-strict equality reductions. |
| 796 void CheckEqualityReduction(JSTypedLoweringTester* R, bool strict, Node* l, | 806 void CheckEqualityReduction(JSTypedLoweringTester* R, bool strict, Node* l, |
| 797 Node* r, IrOpcode::Value expected) { | 807 Node* r, IrOpcode::Value expected) { |
| 798 for (int j = 0; j < 2; j++) { | 808 for (int j = 0; j < 2; j++) { |
| 799 Node* p0 = j == 0 ? l : r; | 809 Node* p0 = j == 0 ? l : r; |
| 800 Node* p1 = j == 1 ? l : r; | 810 Node* p1 = j == 1 ? l : r; |
| 801 | 811 |
| 802 { | 812 { |
| 803 const Operator* op = | 813 const Operator* op = |
| 804 strict ? R->javascript.StrictEqual() : R->javascript.Equal(); | 814 strict ? R->javascript.StrictEqual(CompareOperationHints::Any()) |
| 815 : R->javascript.Equal(CompareOperationHints::Any()); |
| 805 Node* eq = R->Binop(op, p0, p1); | 816 Node* eq = R->Binop(op, p0, p1); |
| 806 Node* r = R->reduce(eq); | 817 Node* r = R->reduce(eq); |
| 807 R->CheckBinop(expected, r); | 818 R->CheckBinop(expected, r); |
| 808 } | 819 } |
| 809 | 820 |
| 810 { | 821 { |
| 811 const Operator* op = | 822 const Operator* op = |
| 812 strict ? R->javascript.StrictNotEqual() : R->javascript.NotEqual(); | 823 strict ? R->javascript.StrictNotEqual(CompareOperationHints::Any()) |
| 824 : R->javascript.NotEqual(CompareOperationHints::Any()); |
| 813 Node* ne = R->Binop(op, p0, p1); | 825 Node* ne = R->Binop(op, p0, p1); |
| 814 Node* n = R->reduce(ne); | 826 Node* n = R->reduce(ne); |
| 815 CHECK_EQ(IrOpcode::kBooleanNot, n->opcode()); | 827 CHECK_EQ(IrOpcode::kBooleanNot, n->opcode()); |
| 816 Node* r = n->InputAt(0); | 828 Node* r = n->InputAt(0); |
| 817 R->CheckBinop(expected, r); | 829 R->CheckBinop(expected, r); |
| 818 } | 830 } |
| 819 } | 831 } |
| 820 } | 832 } |
| 821 | 833 |
| 822 | 834 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 Node* p1 = R.Parameter(Type::String()); | 881 Node* p1 = R.Parameter(Type::String()); |
| 870 | 882 |
| 871 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual); | 883 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual); |
| 872 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual); | 884 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual); |
| 873 } | 885 } |
| 874 | 886 |
| 875 TEST(RemovePureNumberBinopEffects) { | 887 TEST(RemovePureNumberBinopEffects) { |
| 876 JSTypedLoweringTester R; | 888 JSTypedLoweringTester R; |
| 877 | 889 |
| 878 const Operator* ops[] = { | 890 const Operator* ops[] = { |
| 879 R.javascript.Equal(), R.simplified.NumberEqual(), | 891 R.javascript.Equal(R.compare_hints), |
| 880 R.javascript.Add(R.hints), R.simplified.NumberAdd(), | 892 R.simplified.NumberEqual(), |
| 881 R.javascript.Subtract(R.hints), R.simplified.NumberSubtract(), | 893 R.javascript.Add(R.binop_hints), |
| 882 R.javascript.Multiply(R.hints), R.simplified.NumberMultiply(), | 894 R.simplified.NumberAdd(), |
| 883 R.javascript.Divide(R.hints), R.simplified.NumberDivide(), | 895 R.javascript.Subtract(R.binop_hints), |
| 884 R.javascript.Modulus(R.hints), R.simplified.NumberModulus(), | 896 R.simplified.NumberSubtract(), |
| 885 R.javascript.LessThan(), R.simplified.NumberLessThan(), | 897 R.javascript.Multiply(R.binop_hints), |
| 886 R.javascript.LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 898 R.simplified.NumberMultiply(), |
| 899 R.javascript.Divide(R.binop_hints), |
| 900 R.simplified.NumberDivide(), |
| 901 R.javascript.Modulus(R.binop_hints), |
| 902 R.simplified.NumberModulus(), |
| 903 R.javascript.LessThan(R.compare_hints), |
| 904 R.simplified.NumberLessThan(), |
| 905 R.javascript.LessThanOrEqual(R.compare_hints), |
| 906 R.simplified.NumberLessThanOrEqual(), |
| 887 }; | 907 }; |
| 888 | 908 |
| 889 for (size_t j = 0; j < arraysize(ops); j += 2) { | 909 for (size_t j = 0; j < arraysize(ops); j += 2) { |
| 890 BinopEffectsTester B(ops[j], Type::Number(), Type::Number()); | 910 BinopEffectsTester B(ops[j], Type::Number(), Type::Number()); |
| 891 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 911 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
| 892 | 912 |
| 893 B.R.CheckBinop(B.result->opcode(), B.result); | 913 B.R.CheckBinop(B.result->opcode(), B.result); |
| 894 | 914 |
| 895 B.CheckNoOp(0); | 915 B.CheckNoOp(0); |
| 896 B.CheckNoOp(1); | 916 B.CheckNoOp(1); |
| 897 | 917 |
| 898 B.CheckEffectsRemoved(); | 918 B.CheckEffectsRemoved(); |
| 899 } | 919 } |
| 900 } | 920 } |
| 901 | 921 |
| 902 | 922 |
| 903 TEST(OrderNumberBinopEffects1) { | 923 TEST(OrderNumberBinopEffects1) { |
| 904 JSTypedLoweringTester R; | 924 JSTypedLoweringTester R; |
| 905 | 925 |
| 906 const Operator* ops[] = { | 926 const Operator* ops[] = { |
| 907 R.javascript.Subtract(R.hints), R.simplified.NumberSubtract(), | 927 R.javascript.Subtract(R.binop_hints), R.simplified.NumberSubtract(), |
| 908 R.javascript.Multiply(R.hints), R.simplified.NumberMultiply(), | 928 R.javascript.Multiply(R.binop_hints), R.simplified.NumberMultiply(), |
| 909 R.javascript.Divide(R.hints), R.simplified.NumberDivide(), | 929 R.javascript.Divide(R.binop_hints), R.simplified.NumberDivide(), |
| 910 }; | 930 }; |
| 911 | 931 |
| 912 for (size_t j = 0; j < arraysize(ops); j += 2) { | 932 for (size_t j = 0; j < arraysize(ops); j += 2) { |
| 913 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol()); | 933 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol()); |
| 914 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 934 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
| 915 | 935 |
| 916 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); | 936 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); |
| 917 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 937 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
| 918 | 938 |
| 919 CHECK_EQ(B.p0, i0->InputAt(0)); | 939 CHECK_EQ(B.p0, i0->InputAt(0)); |
| 920 CHECK_EQ(B.p1, i1->InputAt(0)); | 940 CHECK_EQ(B.p1, i1->InputAt(0)); |
| 921 | 941 |
| 922 // Effects should be ordered start -> i0 -> i1 -> effect_use | 942 // Effects should be ordered start -> i0 -> i1 -> effect_use |
| 923 B.CheckEffectOrdering(i0, i1); | 943 B.CheckEffectOrdering(i0, i1); |
| 924 } | 944 } |
| 925 } | 945 } |
| 926 | 946 |
| 927 | 947 |
| 928 TEST(OrderNumberBinopEffects2) { | 948 TEST(OrderNumberBinopEffects2) { |
| 929 JSTypedLoweringTester R; | 949 JSTypedLoweringTester R; |
| 930 | 950 |
| 931 const Operator* ops[] = { | 951 const Operator* ops[] = { |
| 932 R.javascript.Add(R.hints), R.simplified.NumberAdd(), | 952 R.javascript.Add(R.binop_hints), R.simplified.NumberAdd(), |
| 933 R.javascript.Subtract(R.hints), R.simplified.NumberSubtract(), | 953 R.javascript.Subtract(R.binop_hints), R.simplified.NumberSubtract(), |
| 934 R.javascript.Multiply(R.hints), R.simplified.NumberMultiply(), | 954 R.javascript.Multiply(R.binop_hints), R.simplified.NumberMultiply(), |
| 935 R.javascript.Divide(R.hints), R.simplified.NumberDivide(), | 955 R.javascript.Divide(R.binop_hints), R.simplified.NumberDivide(), |
| 936 }; | 956 }; |
| 937 | 957 |
| 938 for (size_t j = 0; j < arraysize(ops); j += 2) { | 958 for (size_t j = 0; j < arraysize(ops); j += 2) { |
| 939 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol()); | 959 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol()); |
| 940 | 960 |
| 941 Node* i0 = B.CheckNoOp(0); | 961 Node* i0 = B.CheckNoOp(0); |
| 942 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 962 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
| 943 | 963 |
| 944 CHECK_EQ(B.p0, i0); | 964 CHECK_EQ(B.p0, i0); |
| 945 CHECK_EQ(B.p1, i1->InputAt(0)); | 965 CHECK_EQ(B.p1, i1->InputAt(0)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 960 // Effects should be ordered start -> i0 -> effect_use | 980 // Effects should be ordered start -> i0 -> effect_use |
| 961 B.CheckEffectOrdering(i0); | 981 B.CheckEffectOrdering(i0); |
| 962 } | 982 } |
| 963 } | 983 } |
| 964 | 984 |
| 965 | 985 |
| 966 TEST(OrderCompareEffects) { | 986 TEST(OrderCompareEffects) { |
| 967 JSTypedLoweringTester R; | 987 JSTypedLoweringTester R; |
| 968 | 988 |
| 969 const Operator* ops[] = { | 989 const Operator* ops[] = { |
| 970 R.javascript.GreaterThan(), R.simplified.NumberLessThan(), | 990 R.javascript.GreaterThan(R.compare_hints), R.simplified.NumberLessThan(), |
| 971 R.javascript.GreaterThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 991 R.javascript.GreaterThanOrEqual(R.compare_hints), |
| 992 R.simplified.NumberLessThanOrEqual(), |
| 972 }; | 993 }; |
| 973 | 994 |
| 974 for (size_t j = 0; j < arraysize(ops); j += 2) { | 995 for (size_t j = 0; j < arraysize(ops); j += 2) { |
| 975 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String()); | 996 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String()); |
| 976 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 997 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
| 977 | 998 |
| 978 Node* i0 = B.CheckConvertedInput(IrOpcode::kStringToNumber, 0, false); | 999 Node* i0 = B.CheckConvertedInput(IrOpcode::kStringToNumber, 0, false); |
| 979 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 1000 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
| 980 | 1001 |
| 981 // Inputs should be commuted. | 1002 // Inputs should be commuted. |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 | 1192 |
| 1172 struct Entry { | 1193 struct Entry { |
| 1173 const Operator* js_op; | 1194 const Operator* js_op; |
| 1174 const Operator* uint_op; | 1195 const Operator* uint_op; |
| 1175 const Operator* int_op; | 1196 const Operator* int_op; |
| 1176 const Operator* num_op; | 1197 const Operator* num_op; |
| 1177 bool commute; | 1198 bool commute; |
| 1178 }; | 1199 }; |
| 1179 | 1200 |
| 1180 Entry ops[] = { | 1201 Entry ops[] = { |
| 1181 {R.javascript.LessThan(), R.machine.Uint32LessThan(), | 1202 {R.javascript.LessThan(R.compare_hints), R.machine.Uint32LessThan(), |
| 1182 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false}, | 1203 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false}, |
| 1183 {R.javascript.LessThanOrEqual(), R.machine.Uint32LessThanOrEqual(), | 1204 {R.javascript.LessThanOrEqual(R.compare_hints), |
| 1184 R.machine.Int32LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 1205 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), |
| 1185 false}, | 1206 R.simplified.NumberLessThanOrEqual(), false}, |
| 1186 {R.javascript.GreaterThan(), R.machine.Uint32LessThan(), | 1207 {R.javascript.GreaterThan(R.compare_hints), R.machine.Uint32LessThan(), |
| 1187 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true}, | 1208 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true}, |
| 1188 {R.javascript.GreaterThanOrEqual(), R.machine.Uint32LessThanOrEqual(), | 1209 {R.javascript.GreaterThanOrEqual(R.compare_hints), |
| 1189 R.machine.Int32LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 1210 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), |
| 1190 true}}; | 1211 R.simplified.NumberLessThanOrEqual(), true}}; |
| 1191 | 1212 |
| 1192 for (size_t o = 0; o < arraysize(ops); o++) { | 1213 for (size_t o = 0; o < arraysize(ops); o++) { |
| 1193 for (size_t i = 0; i < arraysize(kNumberTypes); i++) { | 1214 for (size_t i = 0; i < arraysize(kNumberTypes); i++) { |
| 1194 Type* t0 = kNumberTypes[i]; | 1215 Type* t0 = kNumberTypes[i]; |
| 1195 Node* p0 = R.Parameter(t0, 0); | 1216 Node* p0 = R.Parameter(t0, 0); |
| 1196 | 1217 |
| 1197 for (size_t j = 0; j < arraysize(kNumberTypes); j++) { | 1218 for (size_t j = 0; j < arraysize(kNumberTypes); j++) { |
| 1198 Type* t1 = kNumberTypes[j]; | 1219 Type* t1 = kNumberTypes[j]; |
| 1199 Node* p1 = R.Parameter(t1, 1); | 1220 Node* p1 = R.Parameter(t1, 1); |
| 1200 | 1221 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1218 CHECK_EQ(p1, r->InputAt(1)); | 1239 CHECK_EQ(p1, r->InputAt(1)); |
| 1219 } | 1240 } |
| 1220 } | 1241 } |
| 1221 } | 1242 } |
| 1222 } | 1243 } |
| 1223 } | 1244 } |
| 1224 | 1245 |
| 1225 } // namespace compiler | 1246 } // namespace compiler |
| 1226 } // namespace internal | 1247 } // namespace internal |
| 1227 } // namespace v8 | 1248 } // namespace v8 |
| OLD | NEW |