diff options
author | 2014-09-02 15:17:15 +0100 | |
---|---|---|
committer | 2014-09-08 12:15:07 +0100 | |
commit | 3946844c34ad965515f677084b07d663d70ad1b8 (patch) | |
tree | 0d85bfba2ff69c34a2897351d1e50a1464509305 /compiler/optimizing/register_allocator.h | |
parent | e2c23739c6395a83b30ece38f8a2e9e1bf7cf3ce (diff) |
Runtime support for the new stack maps for the opt compiler.
Now most of the methods supported by the compiler can be optimized,
instead of using the baseline.
Change-Id: I80ab36a34913fa4e7dd576c7bf55af63594dc1fa
Diffstat (limited to 'compiler/optimizing/register_allocator.h')
-rw-r--r-- | compiler/optimizing/register_allocator.h | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/compiler/optimizing/register_allocator.h b/compiler/optimizing/register_allocator.h index be1c7ec7c6..f737491026 100644 --- a/compiler/optimizing/register_allocator.h +++ b/compiler/optimizing/register_allocator.h @@ -59,6 +59,7 @@ class RegisterAllocator { // Helper method for validation. Used by unit testing. static bool ValidateIntervals(const GrowableArray<LiveInterval*>& intervals, size_t number_of_spill_slots, + size_t number_of_out_slots, const CodeGenerator& codegen, ArenaAllocator* allocator, bool processing_core_registers, @@ -83,8 +84,8 @@ class RegisterAllocator { bool AllocateBlockedReg(LiveInterval* interval); void Resolve(); - // Add `interval` in the sorted list of unhandled intervals. - void AddToUnhandled(LiveInterval* interval); + // Add `interval` in the given sorted list. + static void AddSorted(GrowableArray<LiveInterval*>* array, LiveInterval* interval); // Split `interval` at the position `at`. The new interval starts at `at`. LiveInterval* Split(LiveInterval* interval, size_t at); @@ -115,6 +116,7 @@ class RegisterAllocator { // Helper methods. void AllocateRegistersInternal(); + void ProcessInstruction(HInstruction* instruction); bool ValidateInternal(bool log_fatal_on_failure) const; void DumpInterval(std::ostream& stream, LiveInterval* interval) const; @@ -122,9 +124,17 @@ class RegisterAllocator { CodeGenerator* const codegen_; const SsaLivenessAnalysis& liveness_; - // List of intervals that must be processed, ordered by start position. Last entry - // is the interval that has the lowest start position. - GrowableArray<LiveInterval*> unhandled_; + // List of intervals for core registers that must be processed, ordered by start + // position. Last entry is the interval that has the lowest start position. + // This list is initially populated before doing the linear scan. + GrowableArray<LiveInterval*> unhandled_core_intervals_; + + // List of intervals for floating-point registers. Same comments as above. + GrowableArray<LiveInterval*> unhandled_fp_intervals_; + + // Currently processed list of unhandled intervals. Either `unhandled_core_intervals_` + // or `unhandled_fp_intervals_`. + GrowableArray<LiveInterval*>* unhandled_; // List of intervals that have been processed. GrowableArray<LiveInterval*> handled_; @@ -137,13 +147,20 @@ class RegisterAllocator { // That is, they have a lifetime hole that spans the start of the new interval. GrowableArray<LiveInterval*> inactive_; - // Fixed intervals for physical registers. Such an interval covers the positions + // Fixed intervals for physical registers. Such intervals cover the positions // where an instruction requires a specific register. GrowableArray<LiveInterval*> physical_register_intervals_; + // Intervals for temporaries. Such intervals cover the positions + // where an instruction requires a temporary. + GrowableArray<LiveInterval*> temp_intervals_; + // The spill slots allocated for live intervals. GrowableArray<size_t> spill_slots_; + // Instructions that need a safepoint. + GrowableArray<HInstruction*> safepoints_; + // True if processing core registers. False if processing floating // point registers. bool processing_core_registers_; @@ -157,6 +174,9 @@ class RegisterAllocator { // Blocked registers, as decided by the code generator. bool* const blocked_registers_; + // Slots reserved for out arguments. + size_t reserved_out_slots_; + DISALLOW_COPY_AND_ASSIGN(RegisterAllocator); }; |