| //===-- llvm/CodeGen/PhysRegTracker.h - Physical Register Tracker -*- C++ -*-=// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file was developed by the LLVM research group and is distributed under | 
 | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file implements a physical register tracker. The tracker | 
 | // tracks physical register usage through addRegUse and | 
 | // delRegUse. isRegAvail checks if a physical register is available or | 
 | // not taking into consideration register aliases. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_CODEGEN_PHYSREGTRACKER_H | 
 | #define LLVM_CODEGEN_PHYSREGTRACKER_H | 
 |  | 
 | #include "llvm/Target/MRegisterInfo.h" | 
 |  | 
 | namespace llvm { | 
 |  | 
 |     class PhysRegTracker { | 
 |         const MRegisterInfo* mri_; | 
 |         std::vector<unsigned> regUse_; | 
 |  | 
 |     public: | 
 |         PhysRegTracker(const MRegisterInfo& mri) | 
 |             : mri_(&mri), | 
 |               regUse_(mri_->getNumRegs(), 0) { | 
 |         } | 
 |  | 
 |         PhysRegTracker(const PhysRegTracker& rhs) | 
 |             : mri_(rhs.mri_), | 
 |               regUse_(rhs.regUse_) { | 
 |         } | 
 |  | 
 |         const PhysRegTracker& operator=(const PhysRegTracker& rhs) { | 
 |             mri_ = rhs.mri_; | 
 |             regUse_ = rhs.regUse_; | 
 |             return *this; | 
 |         } | 
 |  | 
 |         void addRegUse(unsigned physReg) { | 
 |             assert(MRegisterInfo::isPhysicalRegister(physReg) && | 
 |                    "should be physical register!"); | 
 |             ++regUse_[physReg]; | 
 |             for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) | 
 |                 ++regUse_[*as]; | 
 |         } | 
 |  | 
 |         void delRegUse(unsigned physReg) { | 
 |             assert(MRegisterInfo::isPhysicalRegister(physReg) && | 
 |                    "should be physical register!"); | 
 |             assert(regUse_[physReg] != 0); | 
 |             --regUse_[physReg]; | 
 |             for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) { | 
 |                 assert(regUse_[*as] != 0); | 
 |                 --regUse_[*as]; | 
 |             } | 
 |         } | 
 |  | 
 |         bool isRegAvail(unsigned physReg) const { | 
 |             assert(MRegisterInfo::isPhysicalRegister(physReg) && | 
 |                    "should be physical register!"); | 
 |             return regUse_[physReg] == 0; | 
 |         } | 
 |     }; | 
 |  | 
 | } // End llvm namespace | 
 |  | 
 | #endif |