|  | //===-- llvm/CodeGen/PhysRegTracker.h - Physical Register Tracker -*- C++ -*-=// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file 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/TargetRegisterInfo.h" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class PhysRegTracker { | 
|  | const TargetRegisterInfo* tri_; | 
|  | std::vector<unsigned> regUse_; | 
|  |  | 
|  | public: | 
|  | explicit PhysRegTracker(const TargetRegisterInfo& tri) | 
|  | : tri_(&tri), | 
|  | regUse_(tri_->getNumRegs(), 0) { | 
|  | } | 
|  |  | 
|  | PhysRegTracker(const PhysRegTracker& rhs) | 
|  | : tri_(rhs.tri_), | 
|  | regUse_(rhs.regUse_) { | 
|  | } | 
|  |  | 
|  | const PhysRegTracker& operator=(const PhysRegTracker& rhs) { | 
|  | tri_ = rhs.tri_; | 
|  | regUse_ = rhs.regUse_; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | void addRegUse(unsigned physReg) { | 
|  | assert(TargetRegisterInfo::isPhysicalRegister(physReg) && | 
|  | "should be physical register!"); | 
|  | ++regUse_[physReg]; | 
|  | for (const unsigned* as = tri_->getAliasSet(physReg); *as; ++as) | 
|  | ++regUse_[*as]; | 
|  | } | 
|  |  | 
|  | void delRegUse(unsigned physReg) { | 
|  | assert(TargetRegisterInfo::isPhysicalRegister(physReg) && | 
|  | "should be physical register!"); | 
|  | assert(regUse_[physReg] != 0); | 
|  | --regUse_[physReg]; | 
|  | for (const unsigned* as = tri_->getAliasSet(physReg); *as; ++as) { | 
|  | assert(regUse_[*as] != 0); | 
|  | --regUse_[*as]; | 
|  | } | 
|  | } | 
|  |  | 
|  | bool isRegAvail(unsigned physReg) const { | 
|  | assert(TargetRegisterInfo::isPhysicalRegister(physReg) && | 
|  | "should be physical register!"); | 
|  | return regUse_[physReg] == 0; | 
|  | } | 
|  | }; | 
|  |  | 
|  | } // End llvm namespace | 
|  |  | 
|  | #endif |