OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
6 | 6 |
7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/compilation-info.h" | 9 #include "src/compilation-info.h" |
10 #include "src/compiler/bytecode-branch-analysis.h" | 10 #include "src/compiler/bytecode-branch-analysis.h" |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 | 562 |
563 | 563 |
564 VectorSlotPair BytecodeGraphBuilder::CreateVectorSlotPair(int slot_id) { | 564 VectorSlotPair BytecodeGraphBuilder::CreateVectorSlotPair(int slot_id) { |
565 FeedbackVectorSlot slot; | 565 FeedbackVectorSlot slot; |
566 if (slot_id >= TypeFeedbackVector::kReservedIndexCount) { | 566 if (slot_id >= TypeFeedbackVector::kReservedIndexCount) { |
567 slot = feedback_vector()->ToSlot(slot_id); | 567 slot = feedback_vector()->ToSlot(slot_id); |
568 } | 568 } |
569 return VectorSlotPair(feedback_vector(), slot); | 569 return VectorSlotPair(feedback_vector(), slot); |
570 } | 570 } |
571 | 571 |
572 bool BytecodeGraphBuilder::CreateGraph() { | 572 bool BytecodeGraphBuilder::CreateGraph(bool stack_check) { |
573 // Set up the basic structure of the graph. Outputs for {Start} are the formal | 573 // Set up the basic structure of the graph. Outputs for {Start} are the formal |
574 // parameters (including the receiver) plus new target, number of arguments, | 574 // parameters (including the receiver) plus new target, number of arguments, |
575 // context and closure. | 575 // context and closure. |
576 int actual_parameter_count = bytecode_array()->parameter_count() + 4; | 576 int actual_parameter_count = bytecode_array()->parameter_count() + 4; |
577 graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count))); | 577 graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count))); |
578 | 578 |
579 Environment env(this, bytecode_array()->register_count(), | 579 Environment env(this, bytecode_array()->register_count(), |
580 bytecode_array()->parameter_count(), graph()->start(), | 580 bytecode_array()->parameter_count(), graph()->start(), |
581 GetFunctionContext()); | 581 GetFunctionContext()); |
582 set_environment(&env); | 582 set_environment(&env); |
583 | 583 |
584 VisitBytecodes(); | 584 VisitBytecodes(stack_check); |
585 | 585 |
586 // Finish the basic structure of the graph. | 586 // Finish the basic structure of the graph. |
587 DCHECK_NE(0u, exit_controls_.size()); | 587 DCHECK_NE(0u, exit_controls_.size()); |
588 int const input_count = static_cast<int>(exit_controls_.size()); | 588 int const input_count = static_cast<int>(exit_controls_.size()); |
589 Node** const inputs = &exit_controls_.front(); | 589 Node** const inputs = &exit_controls_.front(); |
590 Node* end = graph()->NewNode(common()->End(input_count), input_count, inputs); | 590 Node* end = graph()->NewNode(common()->End(input_count), input_count, inputs); |
591 graph()->SetEnd(end); | 591 graph()->SetEnd(end); |
592 | 592 |
593 ClearNonLiveSlotsInFrameStates(); | 593 ClearNonLiveSlotsInFrameStates(); |
594 | 594 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 NonLiveFrameStateSlotReplacer replacer( | 634 NonLiveFrameStateSlotReplacer replacer( |
635 &state_values_cache_, jsgraph()->OptimizedOutConstant(), | 635 &state_values_cache_, jsgraph()->OptimizedOutConstant(), |
636 liveness_analyzer()->local_count(), true, local_zone()); | 636 liveness_analyzer()->local_count(), true, local_zone()); |
637 liveness_analyzer()->Run(&replacer); | 637 liveness_analyzer()->Run(&replacer); |
638 if (FLAG_trace_environment_liveness) { | 638 if (FLAG_trace_environment_liveness) { |
639 OFStream os(stdout); | 639 OFStream os(stdout); |
640 liveness_analyzer()->Print(os); | 640 liveness_analyzer()->Print(os); |
641 } | 641 } |
642 } | 642 } |
643 | 643 |
644 void BytecodeGraphBuilder::VisitBytecodes() { | 644 void BytecodeGraphBuilder::VisitBytecodes(bool stack_check) { |
645 BytecodeBranchAnalysis analysis(bytecode_array(), local_zone()); | 645 BytecodeBranchAnalysis analysis(bytecode_array(), local_zone()); |
646 BytecodeLoopAnalysis loop_analysis(bytecode_array(), &analysis, local_zone()); | 646 BytecodeLoopAnalysis loop_analysis(bytecode_array(), &analysis, local_zone()); |
647 analysis.Analyze(); | 647 analysis.Analyze(); |
648 loop_analysis.Analyze(); | 648 loop_analysis.Analyze(); |
649 set_branch_analysis(&analysis); | 649 set_branch_analysis(&analysis); |
650 set_loop_analysis(&loop_analysis); | 650 set_loop_analysis(&loop_analysis); |
651 | 651 |
652 interpreter::BytecodeArrayIterator iterator(bytecode_array()); | 652 interpreter::BytecodeArrayIterator iterator(bytecode_array()); |
653 set_bytecode_iterator(&iterator); | 653 set_bytecode_iterator(&iterator); |
654 SourcePositionTableIterator source_position_iterator( | 654 SourcePositionTableIterator source_position_iterator( |
655 bytecode_array()->source_position_table()); | 655 bytecode_array()->source_position_table()); |
656 | 656 |
657 BuildOSRNormalEntryPoint(); | 657 BuildOSRNormalEntryPoint(); |
658 while (!iterator.done()) { | 658 for (; !iterator.done(); iterator.Advance()) { |
659 int current_offset = iterator.current_offset(); | 659 int current_offset = iterator.current_offset(); |
660 UpdateCurrentSourcePosition(&source_position_iterator, current_offset); | 660 UpdateCurrentSourcePosition(&source_position_iterator, current_offset); |
661 EnterAndExitExceptionHandlers(current_offset); | 661 EnterAndExitExceptionHandlers(current_offset); |
662 SwitchToMergeEnvironment(current_offset); | 662 SwitchToMergeEnvironment(current_offset); |
663 if (environment() != nullptr) { | 663 if (environment() != nullptr) { |
664 BuildLoopHeaderEnvironment(current_offset); | 664 BuildLoopHeaderEnvironment(current_offset); |
665 BuildOSRLoopEntryPoint(current_offset); | 665 BuildOSRLoopEntryPoint(current_offset); |
666 | 666 |
| 667 // Skip the first stack check if stack_check is false |
| 668 if (!stack_check && |
| 669 iterator.current_bytecode() == interpreter::Bytecode::kStackCheck) { |
| 670 stack_check = true; |
| 671 continue; |
| 672 } |
| 673 |
667 switch (iterator.current_bytecode()) { | 674 switch (iterator.current_bytecode()) { |
668 #define BYTECODE_CASE(name, ...) \ | 675 #define BYTECODE_CASE(name, ...) \ |
669 case interpreter::Bytecode::k##name: \ | 676 case interpreter::Bytecode::k##name: \ |
670 Visit##name(); \ | 677 Visit##name(); \ |
671 break; | 678 break; |
672 BYTECODE_LIST(BYTECODE_CASE) | 679 BYTECODE_LIST(BYTECODE_CASE) |
673 #undef BYTECODE_CODE | 680 #undef BYTECODE_CODE |
674 } | 681 } |
675 } | 682 } |
676 iterator.Advance(); | |
677 } | 683 } |
678 | 684 |
679 set_branch_analysis(nullptr); | 685 set_branch_analysis(nullptr); |
680 set_bytecode_iterator(nullptr); | 686 set_bytecode_iterator(nullptr); |
681 DCHECK(exception_handlers_.empty()); | 687 DCHECK(exception_handlers_.empty()); |
682 } | 688 } |
683 | 689 |
684 void BytecodeGraphBuilder::VisitLdaZero() { | 690 void BytecodeGraphBuilder::VisitLdaZero() { |
685 Node* node = jsgraph()->ZeroConstant(); | 691 Node* node = jsgraph()->ZeroConstant(); |
686 environment()->BindAccumulator(node); | 692 environment()->BindAccumulator(node); |
(...skipping 1547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2234 source_positions_->set_current_position(it->source_position()); | 2240 source_positions_->set_current_position(it->source_position()); |
2235 it->Advance(); | 2241 it->Advance(); |
2236 } else { | 2242 } else { |
2237 DCHECK_GT(it->code_offset(), offset); | 2243 DCHECK_GT(it->code_offset(), offset); |
2238 } | 2244 } |
2239 } | 2245 } |
2240 | 2246 |
2241 } // namespace compiler | 2247 } // namespace compiler |
2242 } // namespace internal | 2248 } // namespace internal |
2243 } // namespace v8 | 2249 } // namespace v8 |
OLD | NEW |