| 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/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
| 8 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 9 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
| 11 #include "src/compiler/node-properties-inl.h" |
| 10 #include "src/compiler/node-properties.h" | 12 #include "src/compiler/node-properties.h" |
| 11 #include "src/compiler/node-properties-inl.h" | |
| 12 #include "src/full-codegen.h" | 13 #include "src/full-codegen.h" |
| 13 #include "src/parser.h" | 14 #include "src/parser.h" |
| 14 #include "src/scopes.h" | 15 #include "src/scopes.h" |
| 15 | 16 |
| 16 namespace v8 { | 17 namespace v8 { |
| 17 namespace internal { | 18 namespace internal { |
| 18 namespace compiler { | 19 namespace compiler { |
| 19 | 20 |
| 20 AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, | 21 AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, |
| 21 JSGraph* jsgraph) | 22 JSGraph* jsgraph) |
| 22 : StructuredGraphBuilder(local_zone, jsgraph->graph(), jsgraph->common()), | 23 : StructuredGraphBuilder(local_zone, jsgraph->graph(), jsgraph->common()), |
| 23 info_(info), | 24 info_(info), |
| 24 jsgraph_(jsgraph), | 25 jsgraph_(jsgraph), |
| 25 globals_(0, local_zone), | 26 globals_(0, local_zone), |
| 26 breakable_(NULL), | 27 breakable_(NULL), |
| 27 execution_context_(NULL) { | 28 execution_context_(NULL), |
| 29 loop_assignment_analysis_(NULL) { |
| 28 InitializeAstVisitor(local_zone); | 30 InitializeAstVisitor(local_zone); |
| 29 } | 31 } |
| 30 | 32 |
| 31 | 33 |
| 32 Node* AstGraphBuilder::GetFunctionClosure() { | 34 Node* AstGraphBuilder::GetFunctionClosure() { |
| 33 if (!function_closure_.is_set()) { | 35 if (!function_closure_.is_set()) { |
| 34 // Parameter -1 is special for the function closure | 36 // Parameter -1 is special for the function closure |
| 35 const Operator* op = common()->Parameter(-1); | 37 const Operator* op = common()->Parameter(-1); |
| 36 Node* node = NewNode(op, graph()->start()); | 38 Node* node = NewNode(op, graph()->start()); |
| 37 function_closure_.set(node); | 39 function_closure_.set(node); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 52 | 54 |
| 53 | 55 |
| 54 bool AstGraphBuilder::CreateGraph() { | 56 bool AstGraphBuilder::CreateGraph() { |
| 55 Scope* scope = info()->scope(); | 57 Scope* scope = info()->scope(); |
| 56 DCHECK(graph() != NULL); | 58 DCHECK(graph() != NULL); |
| 57 | 59 |
| 58 // Set up the basic structure of the graph. | 60 // Set up the basic structure of the graph. |
| 59 int parameter_count = info()->num_parameters(); | 61 int parameter_count = info()->num_parameters(); |
| 60 graph()->SetStart(graph()->NewNode(common()->Start(parameter_count))); | 62 graph()->SetStart(graph()->NewNode(common()->Start(parameter_count))); |
| 61 | 63 |
| 64 if (FLAG_loop_assignment_analysis) { |
| 65 // TODO(turbofan): use a temporary zone for the loop assignment analysis. |
| 66 AstLoopAssignmentAnalyzer analyzer(zone(), info()); |
| 67 loop_assignment_analysis_ = analyzer.Analyze(); |
| 68 } |
| 69 |
| 62 // Initialize the top-level environment. | 70 // Initialize the top-level environment. |
| 63 Environment env(this, scope, graph()->start()); | 71 Environment env(this, scope, graph()->start()); |
| 64 set_environment(&env); | 72 set_environment(&env); |
| 65 | 73 |
| 66 // Build node to initialize local function context. | 74 // Build node to initialize local function context. |
| 67 Node* closure = GetFunctionClosure(); | 75 Node* closure = GetFunctionClosure(); |
| 68 Node* outer = GetFunctionContext(); | 76 Node* outer = GetFunctionContext(); |
| 69 Node* inner = BuildLocalFunctionContext(outer, closure); | 77 Node* inner = BuildLocalFunctionContext(outer, closure); |
| 70 | 78 |
| 71 // Push top-level function scope for the function body. | 79 // Push top-level function scope for the function body. |
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 CaseClause* clause = clauses->at(i); | 580 CaseClause* clause = clauses->at(i); |
| 573 compare_switch.BeginCase(i); | 581 compare_switch.BeginCase(i); |
| 574 VisitStatements(clause->statements()); | 582 VisitStatements(clause->statements()); |
| 575 compare_switch.EndCase(); | 583 compare_switch.EndCase(); |
| 576 } | 584 } |
| 577 | 585 |
| 578 compare_switch.EndSwitch(); | 586 compare_switch.EndSwitch(); |
| 579 } | 587 } |
| 580 | 588 |
| 581 | 589 |
| 590 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( |
| 591 IterationStatement* stmt) { |
| 592 if (loop_assignment_analysis_ == NULL) return NULL; |
| 593 return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); |
| 594 } |
| 595 |
| 596 |
| 582 void AstGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { | 597 void AstGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| 583 LoopBuilder while_loop(this); | 598 LoopBuilder while_loop(this); |
| 584 while_loop.BeginLoop(); | 599 while_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
| 585 VisitIterationBody(stmt, &while_loop, 0); | 600 VisitIterationBody(stmt, &while_loop, 0); |
| 586 while_loop.EndBody(); | 601 while_loop.EndBody(); |
| 587 VisitForTest(stmt->cond()); | 602 VisitForTest(stmt->cond()); |
| 588 Node* condition = environment()->Pop(); | 603 Node* condition = environment()->Pop(); |
| 589 while_loop.BreakUnless(condition); | 604 while_loop.BreakUnless(condition); |
| 590 while_loop.EndLoop(); | 605 while_loop.EndLoop(); |
| 591 } | 606 } |
| 592 | 607 |
| 593 | 608 |
| 594 void AstGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { | 609 void AstGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
| 595 LoopBuilder while_loop(this); | 610 LoopBuilder while_loop(this); |
| 596 while_loop.BeginLoop(); | 611 while_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
| 597 VisitForTest(stmt->cond()); | 612 VisitForTest(stmt->cond()); |
| 598 Node* condition = environment()->Pop(); | 613 Node* condition = environment()->Pop(); |
| 599 while_loop.BreakUnless(condition); | 614 while_loop.BreakUnless(condition); |
| 600 VisitIterationBody(stmt, &while_loop, 0); | 615 VisitIterationBody(stmt, &while_loop, 0); |
| 601 while_loop.EndBody(); | 616 while_loop.EndBody(); |
| 602 while_loop.EndLoop(); | 617 while_loop.EndLoop(); |
| 603 } | 618 } |
| 604 | 619 |
| 605 | 620 |
| 606 void AstGraphBuilder::VisitForStatement(ForStatement* stmt) { | 621 void AstGraphBuilder::VisitForStatement(ForStatement* stmt) { |
| 607 LoopBuilder for_loop(this); | 622 LoopBuilder for_loop(this); |
| 608 VisitIfNotNull(stmt->init()); | 623 VisitIfNotNull(stmt->init()); |
| 609 for_loop.BeginLoop(); | 624 for_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
| 610 if (stmt->cond() != NULL) { | 625 if (stmt->cond() != NULL) { |
| 611 VisitForTest(stmt->cond()); | 626 VisitForTest(stmt->cond()); |
| 612 Node* condition = environment()->Pop(); | 627 Node* condition = environment()->Pop(); |
| 613 for_loop.BreakUnless(condition); | 628 for_loop.BreakUnless(condition); |
| 614 } else { | 629 } else { |
| 615 for_loop.BreakUnless(jsgraph()->TrueConstant()); | 630 for_loop.BreakUnless(jsgraph()->TrueConstant()); |
| 616 } | 631 } |
| 617 VisitIterationBody(stmt, &for_loop, 0); | 632 VisitIterationBody(stmt, &for_loop, 0); |
| 618 for_loop.EndBody(); | 633 for_loop.EndBody(); |
| 619 VisitIfNotNull(stmt->next()); | 634 VisitIfNotNull(stmt->next()); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 environment()->Pop(); | 690 environment()->Pop(); |
| 676 have_no_properties.Else(); | 691 have_no_properties.Else(); |
| 677 { | 692 { |
| 678 // Construct the rest of the environment. | 693 // Construct the rest of the environment. |
| 679 environment()->Push(cache_type); | 694 environment()->Push(cache_type); |
| 680 environment()->Push(cache_array); | 695 environment()->Push(cache_array); |
| 681 environment()->Push(cache_length); | 696 environment()->Push(cache_length); |
| 682 environment()->Push(jsgraph()->ZeroConstant()); | 697 environment()->Push(jsgraph()->ZeroConstant()); |
| 683 // PrepareForBailoutForId(stmt->BodyId(), NO_REGISTERS); | 698 // PrepareForBailoutForId(stmt->BodyId(), NO_REGISTERS); |
| 684 LoopBuilder for_loop(this); | 699 LoopBuilder for_loop(this); |
| 685 for_loop.BeginLoop(); | 700 for_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
| 686 // Check loop termination condition. | 701 // Check loop termination condition. |
| 687 Node* index = environment()->Peek(0); | 702 Node* index = environment()->Peek(0); |
| 688 Node* exit_cond = | 703 Node* exit_cond = |
| 689 NewNode(javascript()->LessThan(), index, cache_length); | 704 NewNode(javascript()->LessThan(), index, cache_length); |
| 690 // TODO(jarin): provide real bailout id. | 705 // TODO(jarin): provide real bailout id. |
| 691 PrepareFrameState(exit_cond, BailoutId::None()); | 706 PrepareFrameState(exit_cond, BailoutId::None()); |
| 692 for_loop.BreakUnless(exit_cond); | 707 for_loop.BreakUnless(exit_cond); |
| 693 // TODO(dcarney): this runtime call should be a handful of | 708 // TODO(dcarney): this runtime call should be a handful of |
| 694 // simplified instructions that | 709 // simplified instructions that |
| 695 // basically produce | 710 // basically produce |
| (...skipping 1432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2128 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() == | 2143 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() == |
| 2129 IrOpcode::kDead); | 2144 IrOpcode::kDead); |
| 2130 NodeProperties::ReplaceFrameStateInput( | 2145 NodeProperties::ReplaceFrameStateInput( |
| 2131 node, environment()->Checkpoint(ast_id, combine)); | 2146 node, environment()->Checkpoint(ast_id, combine)); |
| 2132 } | 2147 } |
| 2133 } | 2148 } |
| 2134 | 2149 |
| 2135 } | 2150 } |
| 2136 } | 2151 } |
| 2137 } // namespace v8::internal::compiler | 2152 } // namespace v8::internal::compiler |
| OLD | NEW |