Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(492)

Side by Side Diff: src/compiler/register-allocator.h

Issue 1080953006: Revert of Introducing the LLVM greedy register allocator. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/pipeline.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #ifndef V8_REGISTER_ALLOCATOR_H_ 5 #ifndef V8_REGISTER_ALLOCATOR_H_
6 #define V8_REGISTER_ALLOCATOR_H_ 6 #define V8_REGISTER_ALLOCATOR_H_
7 7
8 #include "src/compiler/instruction.h" 8 #include "src/compiler/instruction.h"
9 #include "src/zone-containers.h" 9 #include "src/zone-containers.h"
10 10
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 InstructionOperand* operand, InstructionOperand* hint); 578 InstructionOperand* operand, InstructionOperand* hint);
579 579
580 RegisterAllocationData* const data_; 580 RegisterAllocationData* const data_;
581 581
582 DISALLOW_COPY_AND_ASSIGN(LiveRangeBuilder); 582 DISALLOW_COPY_AND_ASSIGN(LiveRangeBuilder);
583 }; 583 };
584 584
585 585
586 class RegisterAllocator : public ZoneObject { 586 class RegisterAllocator : public ZoneObject {
587 public: 587 public:
588 explicit RegisterAllocator(RegisterAllocationData* data, RegisterKind kind); 588 explicit RegisterAllocator(RegisterAllocationData* data);
589 589
590 protected: 590 protected:
591 RegisterAllocationData* data() const { return data_; } 591 RegisterAllocationData* data() const { return data_; }
592 InstructionSequence* code() const { return data()->code(); } 592 InstructionSequence* code() const { return data()->code(); }
593 RegisterKind mode() const { return mode_; }
594 int num_registers() const { return num_registers_; }
595
596 Zone* allocation_zone() const { return data()->allocation_zone(); } 593 Zone* allocation_zone() const { return data()->allocation_zone(); }
597 594
598 LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); } 595 LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); }
599 596
600 // Split the given range at the given position. 597 // Split the given range at the given position.
601 // If range starts at or after the given position then the 598 // If range starts at or after the given position then the
602 // original range is returned. 599 // original range is returned.
603 // Otherwise returns the live range that starts at pos and contains 600 // Otherwise returns the live range that starts at pos and contains
604 // all uses from the original range that follow pos. Uses at pos will 601 // all uses from the original range that follow pos. Uses at pos will
605 // still be owned by the original range after splitting. 602 // still be owned by the original range after splitting.
(...skipping 11 matching lines...) Expand all
617 614
618 void Spill(LiveRange* range); 615 void Spill(LiveRange* range);
619 616
620 // If we are trying to spill a range inside the loop try to 617 // If we are trying to spill a range inside the loop try to
621 // hoist spill position out to the point just before the loop. 618 // hoist spill position out to the point just before the loop.
622 LifetimePosition FindOptimalSpillingPos(LiveRange* range, 619 LifetimePosition FindOptimalSpillingPos(LiveRange* range,
623 LifetimePosition pos); 620 LifetimePosition pos);
624 621
625 private: 622 private:
626 RegisterAllocationData* const data_; 623 RegisterAllocationData* const data_;
627 const RegisterKind mode_;
628 const int num_registers_;
629 624
630 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator); 625 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator);
631 }; 626 };
632 627
633 628
634 class LinearScanAllocator final : public RegisterAllocator { 629 class LinearScanAllocator final : public RegisterAllocator {
635 public: 630 public:
636 LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind, 631 LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind,
637 Zone* local_zone); 632 Zone* local_zone);
638 633
639 // Phase 4: compute register assignments. 634 // Phase 4: compute register assignments.
640 void AllocateRegisters(); 635 void AllocateRegisters();
641 636
642 private: 637 private:
638 int num_registers() const { return num_registers_; }
643 const char* RegisterName(int allocation_index) const; 639 const char* RegisterName(int allocation_index) const;
644 640
645 ZoneVector<LiveRange*>& unhandled_live_ranges() { 641 ZoneVector<LiveRange*>& unhandled_live_ranges() {
646 return unhandled_live_ranges_; 642 return unhandled_live_ranges_;
647 } 643 }
648 ZoneVector<LiveRange*>& active_live_ranges() { return active_live_ranges_; } 644 ZoneVector<LiveRange*>& active_live_ranges() { return active_live_ranges_; }
649 ZoneVector<LiveRange*>& inactive_live_ranges() { 645 ZoneVector<LiveRange*>& inactive_live_ranges() {
650 return inactive_live_ranges_; 646 return inactive_live_ranges_;
651 } 647 }
652 648
(...skipping 21 matching lines...) Expand all
674 void SpillBetween(LiveRange* range, LifetimePosition start, 670 void SpillBetween(LiveRange* range, LifetimePosition start,
675 LifetimePosition end); 671 LifetimePosition end);
676 672
677 // Spill the given life range after position [start] and up to position [end]. 673 // Spill the given life range after position [start] and up to position [end].
678 // Range is guaranteed to be spilled at least until position [until]. 674 // Range is guaranteed to be spilled at least until position [until].
679 void SpillBetweenUntil(LiveRange* range, LifetimePosition start, 675 void SpillBetweenUntil(LiveRange* range, LifetimePosition start,
680 LifetimePosition until, LifetimePosition end); 676 LifetimePosition until, LifetimePosition end);
681 677
682 void SplitAndSpillIntersecting(LiveRange* range); 678 void SplitAndSpillIntersecting(LiveRange* range);
683 679
680 const RegisterKind mode_;
681 const int num_registers_;
682
684 ZoneVector<LiveRange*> unhandled_live_ranges_; 683 ZoneVector<LiveRange*> unhandled_live_ranges_;
685 ZoneVector<LiveRange*> active_live_ranges_; 684 ZoneVector<LiveRange*> active_live_ranges_;
686 ZoneVector<LiveRange*> inactive_live_ranges_; 685 ZoneVector<LiveRange*> inactive_live_ranges_;
687 686
688 #ifdef DEBUG 687 #ifdef DEBUG
689 LifetimePosition allocation_finger_; 688 LifetimePosition allocation_finger_;
690 #endif 689 #endif
691 690
692 DISALLOW_COPY_AND_ASSIGN(LinearScanAllocator); 691 DISALLOW_COPY_AND_ASSIGN(LinearScanAllocator);
693 }; 692 };
694 693
695 class CoallescedLiveRanges;
696 694
697
698 // A variant of the LLVM Greedy Register Allocator. See
699 // http://blog.llvm.org/2011/09/greedy-register-allocation-in-llvm-30.html
700 class GreedyAllocator final : public RegisterAllocator {
701 public:
702 explicit GreedyAllocator(RegisterAllocationData* data, RegisterKind kind,
703 Zone* local_zone);
704
705 void AllocateRegisters();
706
707 private:
708 const RegisterConfiguration* config() const { return data()->config(); }
709
710 typedef ZonePriorityQueue<std::pair<unsigned, LiveRange*>> PQueue;
711
712 unsigned GetLiveRangeSize(LiveRange* range);
713 void Enqueue(LiveRange* range);
714
715 void Evict(LiveRange* range);
716 float CalculateSpillWeight(LiveRange* range);
717 float CalculateMaxSpillWeight(const ZoneSet<LiveRange*>& ranges);
718
719
720 bool TryAllocate(LiveRange* current, ZoneSet<LiveRange*>* conflicting);
721 bool TryAllocatePhysicalRegister(unsigned reg_id, LiveRange* range,
722 ZoneSet<LiveRange*>* conflicting);
723 bool HandleSpillOperands(LiveRange* range);
724 bool AllocateBlockedRange(LiveRange*, const ZoneSet<LiveRange*>&);
725
726 LiveRange* SpillBetweenUntil(LiveRange* range, LifetimePosition start,
727 LifetimePosition until, LifetimePosition end);
728 void AssignRangeToRegister(int reg_id, LiveRange* range);
729
730 ZoneVector<CoallescedLiveRanges*> allocations_;
731 PQueue queue_;
732 DISALLOW_COPY_AND_ASSIGN(GreedyAllocator);
733 };
734
735
736 class OperandAssigner final : public ZoneObject { 695 class OperandAssigner final : public ZoneObject {
737 public: 696 public:
738 explicit OperandAssigner(RegisterAllocationData* data); 697 explicit OperandAssigner(RegisterAllocationData* data);
739 698
740 // Phase 5: assign spill splots. 699 // Phase 5: assign spill splots.
741 void AssignSpillSlots(); 700 void AssignSpillSlots();
742 701
743 // Phase 6: commit assignment. 702 // Phase 6: commit assignment.
744 void CommitAssignment(); 703 void CommitAssignment();
745 704
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 RegisterAllocationData* const data_; 753 RegisterAllocationData* const data_;
795 754
796 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); 755 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector);
797 }; 756 };
798 757
799 } // namespace compiler 758 } // namespace compiler
800 } // namespace internal 759 } // namespace internal
801 } // namespace v8 760 } // namespace v8
802 761
803 #endif // V8_REGISTER_ALLOCATOR_H_ 762 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW
« no previous file with comments | « src/compiler/pipeline.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698