Newer
Older
Alkis Evlogimenos
committed
//===-- llvm/CodeGen/PhysRegTracker.h - Physical Register Tracker -*- C++ -*-=//
Alkis Evlogimenos
committed
//
// 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
Alkis Evlogimenos
committed
// tracks physical register usage through addRegUse and
// delRegUse. isRegAvail checks if a physical register is available or
// not taking into consideration register aliases.
Alkis Evlogimenos
committed
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_PHYSREGTRACKER_H
#define LLVM_CODEGEN_PHYSREGTRACKER_H
#include "llvm/CodeGen/MachineFunction.h"
namespace llvm {
class PhysRegTracker {
const MRegisterInfo* mri_;
std::vector<unsigned> regUse_;
public:
PhysRegTracker(MachineFunction* mf)
: mri_(mf ? mf->getTarget().getRegisterInfo() : NULL) {
if (mri_) {
regUse_.assign(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];
Alkis Evlogimenos
committed
}
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];
Alkis Evlogimenos
committed
}
}
Alkis Evlogimenos
committed
bool isRegAvail(unsigned physReg) const {