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