1 //===-- llvm/CodeGen/LiveInterval.h - Live Interval Analysis ----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements a physical register tracker. The tracker
11 // tracks physical register usage through addPhysRegUse and
12 // delPhysRegUse functions while abstracting away register aliases.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_CODEGEN_PHYSREGTRACKER_H
17 #define LLVM_CODEGEN_PHYSREGTRACKER_H
19 #include "llvm/CodeGen/MachineFunction.h"
24 class PhysRegTracker {
26 const MRegisterInfo* mri_;
27 std::vector<unsigned> regUse_;
30 PhysRegTracker(MachineFunction* mf)
31 : mri_(mf ? mf->getTarget().getRegisterInfo() : NULL) {
33 regUse_.assign(mri_->getNumRegs(), 0);
37 PhysRegTracker(const PhysRegTracker& rhs)
39 regUse_(rhs.regUse_) {
42 const PhysRegTracker& operator=(const PhysRegTracker& rhs) {
44 regUse_ = rhs.regUse_;
48 void addRegUse(unsigned physReg) {
49 assert(MRegisterInfo::isPhysicalRegister(physReg) &&
50 "should be physical register!");
52 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
58 void delRegUse(unsigned physReg) {
59 assert(MRegisterInfo::isPhysicalRegister(physReg) &&
60 "should be physical register!");
61 assert(regUse_[physReg] != 0);
63 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
65 assert(regUse_[physReg] != 0);
70 bool isPhysRegAvail(unsigned physReg) const {
71 assert(MRegisterInfo::isPhysicalRegister(physReg) &&
72 "should be physical register!");
73 return regUse_[physReg] == 0;
77 } // End llvm namespace