| //===-- 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 |