| 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/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
| 8 #include "src/compiler/change-lowering.h" | 8 #include "src/compiler/change-lowering.h" |
| 9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 10 #include "src/compiler/generic-node-inl.h" | 10 #include "src/compiler/generic-node-inl.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 template <typename ReturnType> | 31 template <typename ReturnType> |
| 32 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { | 32 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { |
| 33 public: | 33 public: |
| 34 SimplifiedLoweringTester(MachineType p0 = kMachNone, | 34 SimplifiedLoweringTester(MachineType p0 = kMachNone, |
| 35 MachineType p1 = kMachNone, | 35 MachineType p1 = kMachNone, |
| 36 MachineType p2 = kMachNone, | 36 MachineType p2 = kMachNone, |
| 37 MachineType p3 = kMachNone, | 37 MachineType p3 = kMachNone, |
| 38 MachineType p4 = kMachNone) | 38 MachineType p4 = kMachNone) |
| 39 : GraphBuilderTester<ReturnType>(p0, p1, p2, p3, p4), | 39 : GraphBuilderTester<ReturnType>(p0, p1, p2, p3, p4), |
| 40 typer(this->zone()), | 40 typer(this->graph(), MaybeHandle<Context>()), |
| 41 javascript(this->zone()), | 41 javascript(this->zone()), |
| 42 jsgraph(this->graph(), this->common(), &javascript, &typer, | 42 jsgraph(this->graph(), this->common(), &javascript, this->machine()), |
| 43 this->machine()), | |
| 44 lowering(&jsgraph) {} | 43 lowering(&jsgraph) {} |
| 45 | 44 |
| 46 Typer typer; | 45 Typer typer; |
| 47 JSOperatorBuilder javascript; | 46 JSOperatorBuilder javascript; |
| 48 JSGraph jsgraph; | 47 JSGraph jsgraph; |
| 49 SimplifiedLowering lowering; | 48 SimplifiedLowering lowering; |
| 50 | 49 |
| 51 void LowerAllNodes() { | 50 void LowerAllNodes() { |
| 52 this->End(); | 51 this->End(); |
| 52 typer.Run(); |
| 53 lowering.LowerAllNodes(); | 53 lowering.LowerAllNodes(); |
| 54 } | 54 } |
| 55 | 55 |
| 56 void LowerAllNodesAndLowerChanges() { | 56 void LowerAllNodesAndLowerChanges() { |
| 57 this->End(); | 57 this->End(); |
| 58 typer.Run(jsgraph.graph(), MaybeHandle<Context>()); | 58 typer.Run(); |
| 59 lowering.LowerAllNodes(); | 59 lowering.LowerAllNodes(); |
| 60 | 60 |
| 61 Zone* zone = this->zone(); | 61 Zone* zone = this->zone(); |
| 62 CompilationInfo info(zone->isolate(), zone); | 62 CompilationInfo info(zone->isolate(), zone); |
| 63 Linkage linkage( | 63 Linkage linkage( |
| 64 &info, Linkage::GetSimplifiedCDescriptor(zone, this->machine_sig_)); | 64 &info, Linkage::GetSimplifiedCDescriptor(zone, this->machine_sig_)); |
| 65 ChangeLowering lowering(&jsgraph, &linkage); | 65 ChangeLowering lowering(&jsgraph, &linkage); |
| 66 GraphReducer reducer(this->graph()); | 66 GraphReducer reducer(this->graph()); |
| 67 reducer.AddReducer(&lowering); | 67 reducer.AddReducer(&lowering); |
| 68 reducer.ReduceGraph(); | 68 reducer.ReduceGraph(); |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 Node* p0; | 667 Node* p0; |
| 668 Node* p1; | 668 Node* p1; |
| 669 Node* p2; | 669 Node* p2; |
| 670 Node* start; | 670 Node* start; |
| 671 Node* end; | 671 Node* end; |
| 672 Node* ret; | 672 Node* ret; |
| 673 | 673 |
| 674 explicit TestingGraph(Type* p0_type, Type* p1_type = Type::None(), | 674 explicit TestingGraph(Type* p0_type, Type* p1_type = Type::None(), |
| 675 Type* p2_type = Type::None()) | 675 Type* p2_type = Type::None()) |
| 676 : GraphAndBuilders(main_zone()), | 676 : GraphAndBuilders(main_zone()), |
| 677 typer(main_zone()), | 677 typer(graph(), MaybeHandle<Context>()), |
| 678 javascript(main_zone()), | 678 javascript(main_zone()), |
| 679 jsgraph(graph(), common(), &javascript, &typer, machine()) { | 679 jsgraph(graph(), common(), &javascript, machine()) { |
| 680 start = graph()->NewNode(common()->Start(2)); | 680 start = graph()->NewNode(common()->Start(2)); |
| 681 graph()->SetStart(start); | 681 graph()->SetStart(start); |
| 682 ret = | 682 ret = |
| 683 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); | 683 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); |
| 684 end = graph()->NewNode(common()->End(), ret); | 684 end = graph()->NewNode(common()->End(), ret); |
| 685 graph()->SetEnd(end); | 685 graph()->SetEnd(end); |
| 686 p0 = graph()->NewNode(common()->Parameter(0), start); | 686 p0 = graph()->NewNode(common()->Parameter(0), start); |
| 687 p1 = graph()->NewNode(common()->Parameter(1), start); | 687 p1 = graph()->NewNode(common()->Parameter(1), start); |
| 688 p2 = graph()->NewNode(common()->Parameter(2), start); | 688 p2 = graph()->NewNode(common()->Parameter(2), start); |
| 689 typer.Run(); |
| 689 NodeProperties::SetBounds(p0, Bounds(p0_type)); | 690 NodeProperties::SetBounds(p0, Bounds(p0_type)); |
| 690 NodeProperties::SetBounds(p1, Bounds(p1_type)); | 691 NodeProperties::SetBounds(p1, Bounds(p1_type)); |
| 691 NodeProperties::SetBounds(p2, Bounds(p2_type)); | 692 NodeProperties::SetBounds(p2, Bounds(p2_type)); |
| 692 } | 693 } |
| 693 | 694 |
| 694 void CheckLoweringBinop(IrOpcode::Value expected, const Operator* op) { | 695 void CheckLoweringBinop(IrOpcode::Value expected, const Operator* op) { |
| 695 Node* node = Return(graph()->NewNode(op, p0, p1)); | 696 Node* node = Return(graph()->NewNode(op, p0, p1)); |
| 696 Lower(); | 697 Lower(); |
| 697 CHECK_EQ(expected, node->opcode()); | 698 CHECK_EQ(expected, node->opcode()); |
| 698 } | 699 } |
| 699 | 700 |
| 700 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, const Operator* op, | 701 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, const Operator* op, |
| 701 const Operator* trunc) { | 702 const Operator* trunc) { |
| 702 Node* node = graph()->NewNode(op, p0, p1); | 703 Node* node = graph()->NewNode(op, p0, p1); |
| 703 Return(graph()->NewNode(trunc, node)); | 704 Return(graph()->NewNode(trunc, node)); |
| 704 Lower(); | 705 Lower(); |
| 705 CHECK_EQ(expected, node->opcode()); | 706 CHECK_EQ(expected, node->opcode()); |
| 706 } | 707 } |
| 707 | 708 |
| 708 void Lower() { | 709 void Lower() { |
| 709 SimplifiedLowering lowering(&jsgraph); | 710 SimplifiedLowering(&jsgraph).LowerAllNodes(); |
| 710 lowering.LowerAllNodes(); | |
| 711 } | 711 } |
| 712 | 712 |
| 713 // Inserts the node as the return value of the graph. | 713 // Inserts the node as the return value of the graph. |
| 714 Node* Return(Node* node) { | 714 Node* Return(Node* node) { |
| 715 ret->ReplaceInput(0, node); | 715 ret->ReplaceInput(0, node); |
| 716 return node; | 716 return node; |
| 717 } | 717 } |
| 718 | 718 |
| 719 // Inserts the node as the effect input to the return of the graph. | 719 // Inserts the node as the effect input to the return of the graph. |
| 720 void Effect(Node* node) { ret->ReplaceInput(1, node); } | 720 void Effect(Node* node) { ret->ReplaceInput(1, node); } |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1533 CHECK_EQ(IrOpcode::kStore, store->opcode()); | 1533 CHECK_EQ(IrOpcode::kStore, store->opcode()); |
| 1534 CHECK_EQ(t.p0, store->InputAt(0)); | 1534 CHECK_EQ(t.p0, store->InputAt(0)); |
| 1535 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(2)); | 1535 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(2)); |
| 1536 } | 1536 } |
| 1537 | 1537 |
| 1538 | 1538 |
| 1539 TEST(UpdatePhi) { | 1539 TEST(UpdatePhi) { |
| 1540 TestingGraph t(Type::Any(), Type::Signed32()); | 1540 TestingGraph t(Type::Any(), Type::Signed32()); |
| 1541 static const MachineType kMachineTypes[] = {kMachInt32, kMachUint32, | 1541 static const MachineType kMachineTypes[] = {kMachInt32, kMachUint32, |
| 1542 kMachFloat64}; | 1542 kMachFloat64}; |
| 1543 Type* kTypes[] = {Type::Signed32(), Type::Unsigned32(), Type::Number()}; |
| 1543 | 1544 |
| 1544 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { | 1545 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { |
| 1545 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1546 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
| 1546 Handle<Name>::null(), Type::Any(), kMachineTypes[i]}; | 1547 Handle<Name>::null(), kTypes[i], kMachineTypes[i]}; |
| 1547 | 1548 |
| 1548 Node* load0 = | 1549 Node* load0 = |
| 1549 t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, t.start); | 1550 t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, t.start); |
| 1550 Node* load1 = | 1551 Node* load1 = |
| 1551 t.graph()->NewNode(t.simplified()->LoadField(access), t.p1, t.start); | 1552 t.graph()->NewNode(t.simplified()->LoadField(access), t.p1, t.start); |
| 1552 Node* phi = t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), load0, | 1553 Node* phi = t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), load0, |
| 1553 load1, t.start); | 1554 load1, t.start); |
| 1554 t.Return(t.Use(phi, kMachineTypes[i])); | 1555 t.Return(t.Use(phi, kMachineTypes[i])); |
| 1555 t.Lower(); | 1556 t.Lower(); |
| 1556 | 1557 |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1924 TestingGraph t(Type::Unsigned32()); | 1925 TestingGraph t(Type::Unsigned32()); |
| 1925 Node* k = t.jsgraph.Constant(0); | 1926 Node* k = t.jsgraph.Constant(0); |
| 1926 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); | 1927 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); |
| 1927 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), mod); | 1928 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), mod); |
| 1928 t.Return(trunc); | 1929 t.Return(trunc); |
| 1929 t.Lower(); | 1930 t.Lower(); |
| 1930 | 1931 |
| 1931 CHECK_EQ(IrOpcode::kFloat64Mod, mod->opcode()); | 1932 CHECK_EQ(IrOpcode::kFloat64Mod, mod->opcode()); |
| 1932 } | 1933 } |
| 1933 } | 1934 } |
| OLD | NEW |