OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/scheduler.h" | 5 #include "src/compiler/scheduler.h" |
6 | 6 |
7 #include <iomanip> | 7 #include <iomanip> |
8 | 8 |
9 #include "src/base/adapters.h" | 9 #include "src/base/adapters.h" |
10 #include "src/bit-vector.h" | 10 #include "src/bit-vector.h" |
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 } | 620 } |
621 | 621 |
622 // Print and verify the special reverse-post-order. | 622 // Print and verify the special reverse-post-order. |
623 void PrintAndVerifySpecialRPO() { | 623 void PrintAndVerifySpecialRPO() { |
624 #if DEBUG | 624 #if DEBUG |
625 if (FLAG_trace_turbo_scheduler) PrintRPO(); | 625 if (FLAG_trace_turbo_scheduler) PrintRPO(); |
626 VerifySpecialRPO(); | 626 VerifySpecialRPO(); |
627 #endif | 627 #endif |
628 } | 628 } |
629 | 629 |
630 const ZoneList<BasicBlock*>& GetOutgoingBlocks(BasicBlock* block) { | 630 const ZoneVector<BasicBlock*>& GetOutgoingBlocks(BasicBlock* block) { |
631 if (HasLoopNumber(block)) { | 631 if (HasLoopNumber(block)) { |
632 LoopInfo const& loop = loops_[GetLoopNumber(block)]; | 632 LoopInfo const& loop = loops_[GetLoopNumber(block)]; |
633 if (loop.outgoing) return *loop.outgoing; | 633 if (loop.outgoing) return *loop.outgoing; |
634 } | 634 } |
635 return empty_; | 635 return empty_; |
636 } | 636 } |
637 | 637 |
638 private: | 638 private: |
639 typedef std::pair<BasicBlock*, size_t> Backedge; | 639 typedef std::pair<BasicBlock*, size_t> Backedge; |
640 | 640 |
641 // Numbering for BasicBlock::rpo_number for this block traversal: | 641 // Numbering for BasicBlock::rpo_number for this block traversal: |
642 static const int kBlockOnStack = -2; | 642 static const int kBlockOnStack = -2; |
643 static const int kBlockVisited1 = -3; | 643 static const int kBlockVisited1 = -3; |
644 static const int kBlockVisited2 = -4; | 644 static const int kBlockVisited2 = -4; |
645 static const int kBlockUnvisited1 = -1; | 645 static const int kBlockUnvisited1 = -1; |
646 static const int kBlockUnvisited2 = kBlockVisited1; | 646 static const int kBlockUnvisited2 = kBlockVisited1; |
647 | 647 |
648 struct SpecialRPOStackFrame { | 648 struct SpecialRPOStackFrame { |
649 BasicBlock* block; | 649 BasicBlock* block; |
650 size_t index; | 650 size_t index; |
651 }; | 651 }; |
652 | 652 |
653 struct LoopInfo { | 653 struct LoopInfo { |
654 BasicBlock* header; | 654 BasicBlock* header; |
655 ZoneList<BasicBlock*>* outgoing; | 655 ZoneVector<BasicBlock*>* outgoing; |
656 BitVector* members; | 656 BitVector* members; |
657 LoopInfo* prev; | 657 LoopInfo* prev; |
658 BasicBlock* end; | 658 BasicBlock* end; |
659 BasicBlock* start; | 659 BasicBlock* start; |
660 | 660 |
661 void AddOutgoing(Zone* zone, BasicBlock* block) { | 661 void AddOutgoing(Zone* zone, BasicBlock* block) { |
662 if (outgoing == NULL) { | 662 if (outgoing == NULL) { |
663 outgoing = new (zone) ZoneList<BasicBlock*>(2, zone); | 663 outgoing = new (zone->New(sizeof(ZoneVector<BasicBlock*>))) |
| 664 ZoneVector<BasicBlock*>(zone); |
664 } | 665 } |
665 outgoing->Add(block, zone); | 666 outgoing->push_back(block); |
666 } | 667 } |
667 }; | 668 }; |
668 | 669 |
669 int Push(ZoneVector<SpecialRPOStackFrame>& stack, int depth, | 670 int Push(ZoneVector<SpecialRPOStackFrame>& stack, int depth, |
670 BasicBlock* child, int unvisited) { | 671 BasicBlock* child, int unvisited) { |
671 if (child->rpo_number() == unvisited) { | 672 if (child->rpo_number() == unvisited) { |
672 stack[depth].block = child; | 673 stack[depth].block = child; |
673 stack[depth].index = 0; | 674 stack[depth].index = 0; |
674 child->set_rpo_number(kBlockOnStack); | 675 child->set_rpo_number(kBlockOnStack); |
675 return depth + 1; | 676 return depth + 1; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
784 order = loop->end; | 785 order = loop->end; |
785 block->set_rpo_number(kBlockVisited2); | 786 block->set_rpo_number(kBlockVisited2); |
786 // Pop the loop stack and continue visiting outgoing edges within | 787 // Pop the loop stack and continue visiting outgoing edges within |
787 // the context of the outer loop, if any. | 788 // the context of the outer loop, if any. |
788 loop = loop->prev; | 789 loop = loop->prev; |
789 // We leave the loop header on the stack; the rest of this iteration | 790 // We leave the loop header on the stack; the rest of this iteration |
790 // and later iterations will go through its outgoing edges list. | 791 // and later iterations will go through its outgoing edges list. |
791 } | 792 } |
792 | 793 |
793 // Use the next outgoing edge if there are any. | 794 // Use the next outgoing edge if there are any. |
794 int outgoing_index = | 795 size_t outgoing_index = frame->index - block->SuccessorCount(); |
795 static_cast<int>(frame->index - block->SuccessorCount()); | |
796 LoopInfo* info = &loops_[GetLoopNumber(block)]; | 796 LoopInfo* info = &loops_[GetLoopNumber(block)]; |
797 DCHECK(loop != info); | 797 DCHECK(loop != info); |
798 if (block != entry && info->outgoing != NULL && | 798 if (block != entry && info->outgoing != NULL && |
799 outgoing_index < info->outgoing->length()) { | 799 outgoing_index < info->outgoing->size()) { |
800 succ = info->outgoing->at(outgoing_index); | 800 succ = info->outgoing->at(outgoing_index); |
801 frame->index++; | 801 frame->index++; |
802 } | 802 } |
803 } | 803 } |
804 | 804 |
805 if (succ != NULL) { | 805 if (succ != NULL) { |
806 // Process the next successor. | 806 // Process the next successor. |
807 if (succ->rpo_number() == kBlockOnStack) continue; | 807 if (succ->rpo_number() == kBlockOnStack) continue; |
808 if (succ->rpo_number() == kBlockVisited2) continue; | 808 if (succ->rpo_number() == kBlockVisited2) continue; |
809 DCHECK(succ->rpo_number() == kBlockUnvisited2); | 809 DCHECK(succ->rpo_number() == kBlockUnvisited2); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1048 #endif // DEBUG | 1048 #endif // DEBUG |
1049 | 1049 |
1050 Zone* zone_; | 1050 Zone* zone_; |
1051 Schedule* schedule_; | 1051 Schedule* schedule_; |
1052 BasicBlock* order_; | 1052 BasicBlock* order_; |
1053 BasicBlock* beyond_end_; | 1053 BasicBlock* beyond_end_; |
1054 ZoneVector<LoopInfo> loops_; | 1054 ZoneVector<LoopInfo> loops_; |
1055 ZoneVector<Backedge> backedges_; | 1055 ZoneVector<Backedge> backedges_; |
1056 ZoneVector<SpecialRPOStackFrame> stack_; | 1056 ZoneVector<SpecialRPOStackFrame> stack_; |
1057 size_t previous_block_count_; | 1057 size_t previous_block_count_; |
1058 ZoneList<BasicBlock*> const empty_; | 1058 ZoneVector<BasicBlock*> const empty_; |
1059 }; | 1059 }; |
1060 | 1060 |
1061 | 1061 |
1062 BasicBlockVector* Scheduler::ComputeSpecialRPO(Zone* zone, Schedule* schedule) { | 1062 BasicBlockVector* Scheduler::ComputeSpecialRPO(Zone* zone, Schedule* schedule) { |
1063 SpecialRPONumberer numberer(zone, schedule); | 1063 SpecialRPONumberer numberer(zone, schedule); |
1064 numberer.ComputeSpecialRPO(); | 1064 numberer.ComputeSpecialRPO(); |
1065 numberer.SerializeRPOIntoSchedule(); | 1065 numberer.SerializeRPOIntoSchedule(); |
1066 numberer.PrintAndVerifySpecialRPO(); | 1066 numberer.PrintAndVerifySpecialRPO(); |
1067 return schedule->rpo_order(); | 1067 return schedule->rpo_order(); |
1068 } | 1068 } |
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1684 for (Node* const node : *nodes) { | 1684 for (Node* const node : *nodes) { |
1685 schedule_->SetBlockForNode(to, node); | 1685 schedule_->SetBlockForNode(to, node); |
1686 scheduled_nodes_[to->id().ToSize()].push_back(node); | 1686 scheduled_nodes_[to->id().ToSize()].push_back(node); |
1687 } | 1687 } |
1688 nodes->clear(); | 1688 nodes->clear(); |
1689 } | 1689 } |
1690 | 1690 |
1691 } // namespace compiler | 1691 } // namespace compiler |
1692 } // namespace internal | 1692 } // namespace internal |
1693 } // namespace v8 | 1693 } // namespace v8 |
OLD | NEW |