Use an IndexedMap for LiveVariables::VirtRegInfo.

Provide MRI::getNumVirtRegs() and TRI::index2VirtReg() functions to allow
iteration over virtual registers without depending on the representation of
virtual register numbers.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123098 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen 2011-01-08 23:10:57 +00:00
parent 56e4d89642
commit b421c566f5
4 changed files with 25 additions and 29 deletions

View File

@ -32,8 +32,10 @@
#include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstr.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/ADT/BitVector.h" #include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/IndexedMap.h"
#include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SparseBitVector.h" #include "llvm/ADT/SparseBitVector.h"
@ -121,10 +123,9 @@ public:
private: private:
/// VirtRegInfo - This list is a mapping from virtual register number to /// VirtRegInfo - This list is a mapping from virtual register number to
/// variable information. FirstVirtualRegister is subtracted from the virtual /// variable information.
/// register number before indexing into this list.
/// ///
std::vector<VarInfo> VirtRegInfo; IndexedMap<VarInfo, VirtReg2IndexFunctor> VirtRegInfo;
/// PHIJoins - list of virtual registers that are PHI joins. These registers /// PHIJoins - list of virtual registers that are PHI joins. These registers
/// may have multiple definitions, and they require special handling when /// may have multiple definitions, and they require special handling when

View File

@ -216,10 +216,14 @@ public:
/// ///
unsigned createVirtualRegister(const TargetRegisterClass *RegClass); unsigned createVirtualRegister(const TargetRegisterClass *RegClass);
/// getNumVirtRegs - Return the number of virtual registers created.
///
unsigned getNumVirtRegs() const { return VRegInfo.size(); }
/// getLastVirtReg - Return the highest currently assigned virtual register. /// getLastVirtReg - Return the highest currently assigned virtual register.
/// ///
unsigned getLastVirtReg() const { unsigned getLastVirtReg() const {
return (unsigned)VRegInfo.size()+TargetRegisterInfo::FirstVirtualRegister-1; return TargetRegisterInfo::index2VirtReg(getNumVirtRegs() - 1);
} }
/// getRegClassVirtRegs - Return the list of virtual registers of the given /// getRegClassVirtRegs - Return the list of virtual registers of the given

View File

@ -321,6 +321,12 @@ public:
return Reg >= FirstVirtualRegister; return Reg >= FirstVirtualRegister;
} }
/// index2VirtReg - Convert a 0-based index to a virtual register number.
/// This is the inverse operation of VirtReg2IndexFunctor below.
static unsigned index2VirtReg(unsigned Index) {
return Index + FirstVirtualRegister;
}
/// printReg - Print a virtual or physical register on OS. /// printReg - Print a virtual or physical register on OS.
void printReg(unsigned Reg, raw_ostream &OS) const; void printReg(unsigned Reg, raw_ostream &OS) const;

View File

@ -31,7 +31,6 @@
#include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/Passes.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetMachine.h"
#include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/DepthFirstIterator.h"
@ -82,13 +81,7 @@ void LiveVariables::VarInfo::dump() const {
LiveVariables::VarInfo &LiveVariables::getVarInfo(unsigned RegIdx) { LiveVariables::VarInfo &LiveVariables::getVarInfo(unsigned RegIdx) {
assert(TargetRegisterInfo::isVirtualRegister(RegIdx) && assert(TargetRegisterInfo::isVirtualRegister(RegIdx) &&
"getVarInfo: not a virtual register!"); "getVarInfo: not a virtual register!");
RegIdx -= TargetRegisterInfo::FirstVirtualRegister; VirtRegInfo.grow(RegIdx);
if (RegIdx >= VirtRegInfo.size()) {
if (RegIdx >= 2*VirtRegInfo.size())
VirtRegInfo.resize(RegIdx*2);
else
VirtRegInfo.resize(2*VirtRegInfo.size());
}
return VirtRegInfo[RegIdx]; return VirtRegInfo[RegIdx];
} }
@ -501,9 +494,6 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
std::fill(PhysRegUse, PhysRegUse + NumRegs, (MachineInstr*)0); std::fill(PhysRegUse, PhysRegUse + NumRegs, (MachineInstr*)0);
PHIJoins.clear(); PHIJoins.clear();
/// Get some space for a respectable number of registers.
VirtRegInfo.resize(64);
analyzePHINodes(mf); analyzePHINodes(mf);
// Calculate live variable information in depth first order on the CFG of the // Calculate live variable information in depth first order on the CFG of the
@ -631,19 +621,14 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
// Convert and transfer the dead / killed information we have gathered into // Convert and transfer the dead / killed information we have gathered into
// VirtRegInfo onto MI's. // VirtRegInfo onto MI's.
for (unsigned i = 0, e1 = VirtRegInfo.size(); i != e1; ++i) for (unsigned i = 0, e1 = VirtRegInfo.size(); i != e1; ++i) {
for (unsigned j = 0, e2 = VirtRegInfo[i].Kills.size(); j != e2; ++j) const unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
if (VirtRegInfo[i].Kills[j] == for (unsigned j = 0, e2 = VirtRegInfo[Reg].Kills.size(); j != e2; ++j)
MRI->getVRegDef(i + TargetRegisterInfo::FirstVirtualRegister)) if (VirtRegInfo[Reg].Kills[j] == MRI->getVRegDef(Reg))
VirtRegInfo[i] VirtRegInfo[Reg].Kills[j]->addRegisterDead(Reg, TRI);
.Kills[j]->addRegisterDead(i +
TargetRegisterInfo::FirstVirtualRegister,
TRI);
else else
VirtRegInfo[i] VirtRegInfo[Reg].Kills[j]->addRegisterKilled(Reg, TRI);
.Kills[j]->addRegisterKilled(i + }
TargetRegisterInfo::FirstVirtualRegister,
TRI);
// Check to make sure there are no unreachable blocks in the MC CFG for the // Check to make sure there are no unreachable blocks in the MC CFG for the
// function. If so, it is due to a bug in the instruction selector or some // function. If so, it is due to a bug in the instruction selector or some
@ -778,8 +763,8 @@ void LiveVariables::addNewBlock(MachineBasicBlock *BB,
getVarInfo(BBI->getOperand(i).getReg()).AliveBlocks.set(NumNew); getVarInfo(BBI->getOperand(i).getReg()).AliveBlocks.set(NumNew);
// Update info for all live variables // Update info for all live variables
for (unsigned Reg = TargetRegisterInfo::FirstVirtualRegister, for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
E = MRI->getLastVirtReg()+1; Reg != E; ++Reg) { unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
VarInfo &VI = getVarInfo(Reg); VarInfo &VI = getVarInfo(Reg);
if (!VI.AliveBlocks.test(NumNew) && VI.isLiveIn(*SuccBB, Reg, *MRI)) if (!VI.AliveBlocks.test(NumNew) && VI.isLiveIn(*SuccBB, Reg, *MRI))
VI.AliveBlocks.set(NumNew); VI.AliveBlocks.set(NumNew);