| 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 <limits> | 5 #include <limits> |
| 6 | 6 |
| 7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
| 8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
| 9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 10 #include "src/compiler/effect-control-linearizer.h" | 10 #include "src/compiler/effect-control-linearizer.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 namespace v8 { | 30 namespace v8 { |
| 31 namespace internal { | 31 namespace internal { |
| 32 namespace compiler { | 32 namespace compiler { |
| 33 | 33 |
| 34 template <typename ReturnType> | 34 template <typename ReturnType> |
| 35 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { | 35 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { |
| 36 public: | 36 public: |
| 37 SimplifiedLoweringTester(MachineType p0 = MachineType::None(), | 37 SimplifiedLoweringTester(MachineType p0 = MachineType::None(), |
| 38 MachineType p1 = MachineType::None()) | 38 MachineType p1 = MachineType::None()) |
| 39 : GraphBuilderTester<ReturnType>(p0, p1), | 39 : GraphBuilderTester<ReturnType>(p0, p1), |
| 40 typer(this->isolate(), this->graph()), | 40 typer(new Typer(this->isolate(), this->graph())), |
| 41 javascript(this->zone()), | 41 javascript(this->zone()), |
| 42 jsgraph(this->isolate(), this->graph(), this->common(), &javascript, | 42 jsgraph(this->isolate(), this->graph(), this->common(), &javascript, |
| 43 this->simplified(), this->machine()), | 43 this->simplified(), this->machine()), |
| 44 source_positions(jsgraph.graph()), | 44 source_positions(jsgraph.graph()), |
| 45 lowering(&jsgraph, this->zone(), &source_positions) {} | 45 lowering(&jsgraph, this->zone(), &source_positions) {} |
| 46 ~SimplifiedLoweringTester() final { delete typer; } |
| 46 | 47 |
| 47 Typer typer; | 48 Typer* typer = nullptr; |
| 48 JSOperatorBuilder javascript; | 49 JSOperatorBuilder javascript; |
| 49 JSGraph jsgraph; | 50 JSGraph jsgraph; |
| 50 SourcePositionTable source_positions; | 51 SourcePositionTable source_positions; |
| 51 SimplifiedLowering lowering; | 52 SimplifiedLowering lowering; |
| 52 | 53 |
| 53 void LowerAllNodes() { | 54 void LowerAllNodes() { |
| 54 this->End(); | 55 this->End(); |
| 55 typer.Run(); | 56 typer->Run(); |
| 57 delete typer, typer = nullptr; |
| 56 lowering.LowerAllNodes(); | 58 lowering.LowerAllNodes(); |
| 57 } | 59 } |
| 58 | 60 |
| 59 void LowerAllNodesAndLowerChanges() { | 61 void LowerAllNodesAndLowerChanges() { |
| 60 this->End(); | 62 this->End(); |
| 61 typer.Run(); | 63 typer->Run(); |
| 64 delete typer, typer = nullptr; |
| 62 lowering.LowerAllNodes(); | 65 lowering.LowerAllNodes(); |
| 63 | 66 |
| 64 Schedule* schedule = Scheduler::ComputeSchedule(this->zone(), this->graph(), | 67 Schedule* schedule = Scheduler::ComputeSchedule(this->zone(), this->graph(), |
| 65 Scheduler::kNoFlags); | 68 Scheduler::kNoFlags); |
| 66 EffectControlLinearizer linearizer(&jsgraph, schedule, this->zone()); | 69 EffectControlLinearizer linearizer(&jsgraph, schedule, this->zone()); |
| 67 linearizer.Run(); | 70 linearizer.Run(); |
| 68 | 71 |
| 69 MemoryOptimizer memory_optimizer(&jsgraph, this->zone()); | 72 MemoryOptimizer memory_optimizer(&jsgraph, this->zone()); |
| 70 memory_optimizer.Optimize(); | 73 memory_optimizer.Optimize(); |
| 71 } | 74 } |
| (...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 CHECK(t.heap()->new_space()->Contains(result) || flag[i] == TENURED); | 678 CHECK(t.heap()->new_space()->Contains(result) || flag[i] == TENURED); |
| 676 CHECK(t.heap()->old_space()->Contains(result) || flag[i] == NOT_TENURED); | 679 CHECK(t.heap()->old_space()->Contains(result) || flag[i] == NOT_TENURED); |
| 677 CHECK(result->IsHeapNumber()); | 680 CHECK(result->IsHeapNumber()); |
| 678 } | 681 } |
| 679 } | 682 } |
| 680 | 683 |
| 681 | 684 |
| 682 // Fills in most of the nodes of the graph in order to make tests shorter. | 685 // Fills in most of the nodes of the graph in order to make tests shorter. |
| 683 class TestingGraph : public HandleAndZoneScope, public GraphAndBuilders { | 686 class TestingGraph : public HandleAndZoneScope, public GraphAndBuilders { |
| 684 public: | 687 public: |
| 685 Typer typer; | 688 Typer* typer = nullptr; |
| 686 JSOperatorBuilder javascript; | 689 JSOperatorBuilder javascript; |
| 687 JSGraph jsgraph; | 690 JSGraph jsgraph; |
| 688 Node* p0; | 691 Node* p0; |
| 689 Node* p1; | 692 Node* p1; |
| 690 Node* p2; | 693 Node* p2; |
| 691 Node* start; | 694 Node* start; |
| 692 Node* end; | 695 Node* end; |
| 693 Node* ret; | 696 Node* ret; |
| 694 | 697 |
| 695 explicit TestingGraph(Type* p0_type, Type* p1_type = Type::None(), | 698 explicit TestingGraph(Type* p0_type, Type* p1_type = Type::None(), |
| 696 Type* p2_type = Type::None()) | 699 Type* p2_type = Type::None()) |
| 697 : GraphAndBuilders(main_zone()), | 700 : GraphAndBuilders(main_zone()), |
| 698 typer(main_isolate(), graph()), | 701 typer(new Typer(main_isolate(), graph())), |
| 699 javascript(main_zone()), | 702 javascript(main_zone()), |
| 700 jsgraph(main_isolate(), graph(), common(), &javascript, simplified(), | 703 jsgraph(main_isolate(), graph(), common(), &javascript, simplified(), |
| 701 machine()) { | 704 machine()) { |
| 702 start = graph()->NewNode(common()->Start(4)); | 705 start = graph()->NewNode(common()->Start(4)); |
| 703 graph()->SetStart(start); | 706 graph()->SetStart(start); |
| 704 ret = | 707 ret = |
| 705 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); | 708 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); |
| 706 end = graph()->NewNode(common()->End(1), ret); | 709 end = graph()->NewNode(common()->End(1), ret); |
| 707 graph()->SetEnd(end); | 710 graph()->SetEnd(end); |
| 708 p0 = graph()->NewNode(common()->Parameter(0), start); | 711 p0 = graph()->NewNode(common()->Parameter(0), start); |
| 709 p1 = graph()->NewNode(common()->Parameter(1), start); | 712 p1 = graph()->NewNode(common()->Parameter(1), start); |
| 710 p2 = graph()->NewNode(common()->Parameter(2), start); | 713 p2 = graph()->NewNode(common()->Parameter(2), start); |
| 711 typer.Run(); | 714 typer->Run(); |
| 712 NodeProperties::SetType(p0, p0_type); | 715 NodeProperties::SetType(p0, p0_type); |
| 713 NodeProperties::SetType(p1, p1_type); | 716 NodeProperties::SetType(p1, p1_type); |
| 714 NodeProperties::SetType(p2, p2_type); | 717 NodeProperties::SetType(p2, p2_type); |
| 715 } | 718 } |
| 719 ~TestingGraph() { delete typer; } |
| 716 | 720 |
| 717 void CheckLoweringBinop(IrOpcode::Value expected, const Operator* op) { | 721 void CheckLoweringBinop(IrOpcode::Value expected, const Operator* op) { |
| 718 Node* node = Return(graph()->NewNode(op, p0, p1)); | 722 Node* node = Return(graph()->NewNode(op, p0, p1)); |
| 719 Lower(); | 723 Lower(); |
| 720 CHECK_EQ(expected, node->opcode()); | 724 CHECK_EQ(expected, node->opcode()); |
| 721 } | 725 } |
| 722 | 726 |
| 723 void CheckLoweringStringBinop(IrOpcode::Value expected, const Operator* op) { | 727 void CheckLoweringStringBinop(IrOpcode::Value expected, const Operator* op) { |
| 724 Node* node = Return( | 728 Node* node = Return( |
| 725 graph()->NewNode(op, p0, p1, graph()->start(), graph()->start())); | 729 graph()->NewNode(op, p0, p1, graph()->start(), graph()->start())); |
| 726 Lower(); | 730 Lower(); |
| 727 CHECK_EQ(expected, node->opcode()); | 731 CHECK_EQ(expected, node->opcode()); |
| 728 } | 732 } |
| 729 | 733 |
| 730 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, const Operator* op, | 734 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, const Operator* op, |
| 731 const Operator* trunc) { | 735 const Operator* trunc) { |
| 732 Node* node = graph()->NewNode(op, p0, p1); | 736 Node* node = graph()->NewNode(op, p0, p1); |
| 733 Return(graph()->NewNode(trunc, node)); | 737 Return(graph()->NewNode(trunc, node)); |
| 734 Lower(); | 738 Lower(); |
| 735 CHECK_EQ(expected, node->opcode()); | 739 CHECK_EQ(expected, node->opcode()); |
| 736 } | 740 } |
| 737 | 741 |
| 738 void Lower() { | 742 void Lower() { |
| 743 delete typer; |
| 739 SourcePositionTable table(jsgraph.graph()); | 744 SourcePositionTable table(jsgraph.graph()); |
| 740 SimplifiedLowering(&jsgraph, jsgraph.zone(), &table).LowerAllNodes(); | 745 SimplifiedLowering(&jsgraph, jsgraph.zone(), &table).LowerAllNodes(); |
| 746 typer = new Typer(main_isolate(), graph()); |
| 741 } | 747 } |
| 742 | 748 |
| 743 void LowerAllNodesAndLowerChanges() { | 749 void LowerAllNodesAndLowerChanges() { |
| 750 delete typer; |
| 744 SourcePositionTable table(jsgraph.graph()); | 751 SourcePositionTable table(jsgraph.graph()); |
| 745 SimplifiedLowering(&jsgraph, jsgraph.zone(), &table).LowerAllNodes(); | 752 SimplifiedLowering(&jsgraph, jsgraph.zone(), &table).LowerAllNodes(); |
| 746 | 753 |
| 747 Schedule* schedule = Scheduler::ComputeSchedule(this->zone(), this->graph(), | 754 Schedule* schedule = Scheduler::ComputeSchedule(this->zone(), this->graph(), |
| 748 Scheduler::kNoFlags); | 755 Scheduler::kNoFlags); |
| 749 EffectControlLinearizer linearizer(&jsgraph, schedule, this->zone()); | 756 EffectControlLinearizer linearizer(&jsgraph, schedule, this->zone()); |
| 750 linearizer.Run(); | 757 linearizer.Run(); |
| 751 | 758 |
| 752 MemoryOptimizer memory_optimizer(&jsgraph, this->zone()); | 759 MemoryOptimizer memory_optimizer(&jsgraph, this->zone()); |
| 753 memory_optimizer.Optimize(); | 760 memory_optimizer.Optimize(); |
| 761 typer = new Typer(main_isolate(), graph()); |
| 754 } | 762 } |
| 755 | 763 |
| 756 // Inserts the node as the return value of the graph. | 764 // Inserts the node as the return value of the graph. |
| 757 Node* Return(Node* node) { | 765 Node* Return(Node* node) { |
| 758 ret->ReplaceInput(0, node); | 766 ret->ReplaceInput(0, node); |
| 759 return node; | 767 return node; |
| 760 } | 768 } |
| 761 | 769 |
| 762 // Inserts the node as the effect input to the return of the graph. | 770 // Inserts the node as the effect input to the return of the graph. |
| 763 void Effect(Node* node) { ret->ReplaceInput(1, node); } | 771 void Effect(Node* node) { ret->ReplaceInput(1, node); } |
| (...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1951 t.Return(use); | 1959 t.Return(use); |
| 1952 t.Lower(); | 1960 t.Lower(); |
| 1953 | 1961 |
| 1954 CHECK_EQ(d.expected, PhiRepresentationOf(phi->op())); | 1962 CHECK_EQ(d.expected, PhiRepresentationOf(phi->op())); |
| 1955 } | 1963 } |
| 1956 } | 1964 } |
| 1957 | 1965 |
| 1958 } // namespace compiler | 1966 } // namespace compiler |
| 1959 } // namespace internal | 1967 } // namespace internal |
| 1960 } // namespace v8 | 1968 } // namespace v8 |
| OLD | NEW |