From 10be4f7ffd20dca88cfbdc29f36152b73960bd90 Mon Sep 17 00:00:00 2001 From: "whesse@chromium.org" Date: Wed, 18 Mar 2009 10:31:31 +0000 Subject: [PATCH] Speed up the inner loop of free register allocation. Review URL: http://codereview.chromium.org/42296 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1528 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/register-allocator.cc | 9 ++++----- src/register-allocator.h | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/register-allocator.cc b/src/register-allocator.cc index 7a96882..b702af4 100644 --- a/src/register-allocator.cc +++ b/src/register-allocator.cc @@ -83,11 +83,10 @@ void RegisterFile::CopyTo(RegisterFile* other) { Result RegisterAllocator::AllocateWithoutSpilling() { // Return the first free register, if any. - for (int i = 0; i < kNumRegisters; i++) { - if (!is_used(i)) { - Register free_reg = { i }; - return Result(free_reg, cgen_); - } + int free_reg = registers_.ScanForFreeRegister(); + if (free_reg < kNumRegisters) { + Register free_result = { free_reg }; + return Result(free_result, cgen_); } return Result(cgen_); } diff --git a/src/register-allocator.h b/src/register-allocator.h index 759ab14..42eb6e0 100644 --- a/src/register-allocator.h +++ b/src/register-allocator.h @@ -149,10 +149,9 @@ class RegisterFile BASE_EMBEDDED { // Record that a register will no longer be used by decrementing its // reference count. void Unuse(Register reg) { + ASSERT(!reg.is(no_reg)); ASSERT(is_used(reg.code())); - if (is_used(reg.code())) { - ref_counts_[reg.code()]--; - } + ref_counts_[reg.code()]--; } // Copy the reference counts from this register file to the other. @@ -161,6 +160,17 @@ class RegisterFile BASE_EMBEDDED { private: int ref_counts_[kNumRegisters]; + // Very fast inlined loop to find a free register. + // Used in RegisterAllocator::AllocateWithoutSpilling. + // Returns kNumRegisters if no free register found. + inline int ScanForFreeRegister() { + int i = 0; + for (; i < kNumRegisters ; ++i) { + if (ref_counts_[i] == 0) break; + } + return i; + } + friend class RegisterAllocator; }; -- 2.7.4