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

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

Issue 1287383003: Re-reland: Remove register index/code indirection (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Updated to ToT Created 5 years, 3 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
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/ostreams.h" 9 #include "src/ostreams.h"
10 #include "src/register-configuration.h"
10 #include "src/zone-containers.h" 11 #include "src/zone-containers.h"
11 12
12 namespace v8 { 13 namespace v8 {
13 namespace internal { 14 namespace internal {
14 namespace compiler { 15 namespace compiler {
15 16
16 enum RegisterKind { 17 enum RegisterKind {
17 GENERAL_REGISTERS, 18 GENERAL_REGISTERS,
18 DOUBLE_REGISTERS 19 DOUBLE_REGISTERS
19 }; 20 };
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 } 235 }
235 UsePositionType type() const { return TypeField::decode(flags_); } 236 UsePositionType type() const { return TypeField::decode(flags_); }
236 void set_type(UsePositionType type, bool register_beneficial); 237 void set_type(UsePositionType type, bool register_beneficial);
237 238
238 LifetimePosition pos() const { return pos_; } 239 LifetimePosition pos() const { return pos_; }
239 240
240 UsePosition* next() const { return next_; } 241 UsePosition* next() const { return next_; }
241 void set_next(UsePosition* next) { next_ = next; } 242 void set_next(UsePosition* next) { next_ = next; }
242 243
243 // For hinting only. 244 // For hinting only.
244 void set_assigned_register(int register_index) { 245 void set_assigned_register(int register_code) {
245 flags_ = AssignedRegisterField::update(flags_, register_index); 246 flags_ = AssignedRegisterField::update(flags_, register_code);
246 } 247 }
247 248
248 UsePositionHintType hint_type() const { 249 UsePositionHintType hint_type() const {
249 return HintTypeField::decode(flags_); 250 return HintTypeField::decode(flags_);
250 } 251 }
251 bool HasHint() const; 252 bool HasHint() const;
252 bool HintRegister(int* register_index) const; 253 bool HintRegister(int* register_code) const;
253 void ResolveHint(UsePosition* use_pos); 254 void ResolveHint(UsePosition* use_pos);
254 bool IsResolved() const { 255 bool IsResolved() const {
255 return hint_type() != UsePositionHintType::kUnresolved; 256 return hint_type() != UsePositionHintType::kUnresolved;
256 } 257 }
257 static UsePositionHintType HintTypeForOperand(const InstructionOperand& op); 258 static UsePositionHintType HintTypeForOperand(const InstructionOperand& op);
258 259
259 private: 260 private:
260 typedef BitField<UsePositionType, 0, 2> TypeField; 261 typedef BitField<UsePositionType, 0, 2> TypeField;
261 typedef BitField<UsePositionHintType, 2, 3> HintTypeField; 262 typedef BitField<UsePositionHintType, 2, 3> HintTypeField;
262 typedef BitField<bool, 5, 1> RegisterBeneficialField; 263 typedef BitField<bool, 5, 1> RegisterBeneficialField;
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 public: 637 public:
637 class PhiMapValue : public ZoneObject { 638 class PhiMapValue : public ZoneObject {
638 public: 639 public:
639 PhiMapValue(PhiInstruction* phi, const InstructionBlock* block, Zone* zone); 640 PhiMapValue(PhiInstruction* phi, const InstructionBlock* block, Zone* zone);
640 641
641 const PhiInstruction* phi() const { return phi_; } 642 const PhiInstruction* phi() const { return phi_; }
642 const InstructionBlock* block() const { return block_; } 643 const InstructionBlock* block() const { return block_; }
643 644
644 // For hinting. 645 // For hinting.
645 int assigned_register() const { return assigned_register_; } 646 int assigned_register() const { return assigned_register_; }
646 void set_assigned_register(int register_index) { 647 void set_assigned_register(int register_code) {
647 DCHECK_EQ(assigned_register_, kUnassignedRegister); 648 DCHECK_EQ(assigned_register_, kUnassignedRegister);
648 assigned_register_ = register_index; 649 assigned_register_ = register_code;
649 } 650 }
650 void UnsetAssignedRegister() { assigned_register_ = kUnassignedRegister; } 651 void UnsetAssignedRegister() { assigned_register_ = kUnassignedRegister; }
651 652
652 void AddOperand(InstructionOperand* operand); 653 void AddOperand(InstructionOperand* operand);
653 void CommitAssignment(const InstructionOperand& operand); 654 void CommitAssignment(const InstructionOperand& operand);
654 655
655 private: 656 private:
656 PhiInstruction* const phi_; 657 PhiInstruction* const phi_;
657 const InstructionBlock* const block_; 658 const InstructionBlock* const block_;
658 ZoneVector<InstructionOperand*> incoming_operands_; 659 ZoneVector<InstructionOperand*> incoming_operands_;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 740
740 private: 741 private:
741 int GetNextLiveRangeId(); 742 int GetNextLiveRangeId();
742 743
743 Zone* const allocation_zone_; 744 Zone* const allocation_zone_;
744 Frame* const frame_; 745 Frame* const frame_;
745 InstructionSequence* const code_; 746 InstructionSequence* const code_;
746 const char* const debug_name_; 747 const char* const debug_name_;
747 const RegisterConfiguration* const config_; 748 const RegisterConfiguration* const config_;
748 PhiMap phi_map_; 749 PhiMap phi_map_;
750 ZoneVector<int> allocatable_codes_;
751 ZoneVector<int> allocatable_double_codes_;
749 ZoneVector<BitVector*> live_in_sets_; 752 ZoneVector<BitVector*> live_in_sets_;
750 ZoneVector<BitVector*> live_out_sets_; 753 ZoneVector<BitVector*> live_out_sets_;
751 ZoneVector<TopLevelLiveRange*> live_ranges_; 754 ZoneVector<TopLevelLiveRange*> live_ranges_;
752 ZoneVector<TopLevelLiveRange*> fixed_live_ranges_; 755 ZoneVector<TopLevelLiveRange*> fixed_live_ranges_;
753 ZoneVector<TopLevelLiveRange*> fixed_double_live_ranges_; 756 ZoneVector<TopLevelLiveRange*> fixed_double_live_ranges_;
754 ZoneVector<SpillRange*> spill_ranges_; 757 ZoneVector<SpillRange*> spill_ranges_;
755 DelayedReferences delayed_references_; 758 DelayedReferences delayed_references_;
756 BitVector* assigned_registers_; 759 BitVector* assigned_registers_;
757 BitVector* assigned_double_registers_; 760 BitVector* assigned_double_registers_;
758 int virtual_register_count_; 761 int virtual_register_count_;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 859
857 class RegisterAllocator : public ZoneObject { 860 class RegisterAllocator : public ZoneObject {
858 public: 861 public:
859 explicit RegisterAllocator(RegisterAllocationData* data, RegisterKind kind); 862 explicit RegisterAllocator(RegisterAllocationData* data, RegisterKind kind);
860 863
861 protected: 864 protected:
862 RegisterAllocationData* data() const { return data_; } 865 RegisterAllocationData* data() const { return data_; }
863 InstructionSequence* code() const { return data()->code(); } 866 InstructionSequence* code() const { return data()->code(); }
864 RegisterKind mode() const { return mode_; } 867 RegisterKind mode() const { return mode_; }
865 int num_registers() const { return num_registers_; } 868 int num_registers() const { return num_registers_; }
869 int num_alloctable_registers() const { return num_allocatable_registers_; }
870 int allocatable_register_code(int allocatable_index) const {
871 return allocatable_register_codes_[allocatable_index];
872 }
866 873
867 Zone* allocation_zone() const { return data()->allocation_zone(); } 874 Zone* allocation_zone() const { return data()->allocation_zone(); }
868 875
869 // Split the given range at the given position. 876 // Split the given range at the given position.
870 // If range starts at or after the given position then the 877 // If range starts at or after the given position then the
871 // original range is returned. 878 // original range is returned.
872 // Otherwise returns the live range that starts at pos and contains 879 // Otherwise returns the live range that starts at pos and contains
873 // all uses from the original range that follow pos. Uses at pos will 880 // all uses from the original range that follow pos. Uses at pos will
874 // still be owned by the original range after splitting. 881 // still be owned by the original range after splitting.
875 LiveRange* SplitRangeAt(LiveRange* range, LifetimePosition pos); 882 LiveRange* SplitRangeAt(LiveRange* range, LifetimePosition pos);
(...skipping 15 matching lines...) Expand all
891 LifetimePosition FindOptimalSpillingPos(LiveRange* range, 898 LifetimePosition FindOptimalSpillingPos(LiveRange* range,
892 LifetimePosition pos); 899 LifetimePosition pos);
893 900
894 const ZoneVector<TopLevelLiveRange*>& GetFixedRegisters() const; 901 const ZoneVector<TopLevelLiveRange*>& GetFixedRegisters() const;
895 const char* RegisterName(int allocation_index) const; 902 const char* RegisterName(int allocation_index) const;
896 903
897 private: 904 private:
898 RegisterAllocationData* const data_; 905 RegisterAllocationData* const data_;
899 const RegisterKind mode_; 906 const RegisterKind mode_;
900 const int num_registers_; 907 const int num_registers_;
908 int num_allocatable_registers_;
909 const int* allocatable_register_codes_;
901 910
902 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator); 911 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator);
903 }; 912 };
904 913
905 914
906 class LinearScanAllocator final : public RegisterAllocator { 915 class LinearScanAllocator final : public RegisterAllocator {
907 public: 916 public:
908 LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind, 917 LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind,
909 Zone* local_zone); 918 Zone* local_zone);
910 919
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 RegisterAllocationData* const data_; 1061 RegisterAllocationData* const data_;
1053 1062
1054 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); 1063 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector);
1055 }; 1064 };
1056 1065
1057 } // namespace compiler 1066 } // namespace compiler
1058 } // namespace internal 1067 } // namespace internal
1059 } // namespace v8 1068 } // namespace v8
1060 1069
1061 #endif // V8_REGISTER_ALLOCATOR_H_ 1070 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698