Update LiveDebugVariables during coalescing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120720 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen 2010-12-02 18:15:44 +00:00
parent 1ab4b211ea
commit 30e2128a73
3 changed files with 56 additions and 0 deletions

View File

@ -241,6 +241,10 @@ public:
/// collecting all their def points.
void computeIntervals(LiveIntervals &LIS, MachineDominatorTree &MDT);
/// renameRegister - Update locations to rewrite OldReg as NewReg:SubIdx.
void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx,
const TargetRegisterInfo *TRI);
void print(raw_ostream&, const TargetRegisterInfo*);
};
} // namespace
@ -269,6 +273,9 @@ class LDVImpl {
/// getUserValue - Find or create a UserValue.
UserValue *getUserValue(const MDNode *Var, unsigned Offset);
/// lookupVirtReg - Find the EC leader for VirtReg or null.
UserValue *lookupVirtReg(unsigned VirtReg);
/// mapVirtReg - Map virtual register to an equivalence class.
void mapVirtReg(unsigned VirtReg, UserValue *EC);
@ -300,6 +307,9 @@ public:
userVarMap.clear();
}
/// renameRegister - Replace all references to OldReg wiht NewReg:SubIdx.
void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx);
void print(raw_ostream&);
};
} // namespace
@ -379,6 +389,12 @@ void LDVImpl::mapVirtReg(unsigned VirtReg, UserValue *EC) {
Leader = UserValue::merge(Leader, EC);
}
UserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) {
if (UserValue *UV = virtRegMap.lookup(VirtReg))
return UV->getLeader();
return 0;
}
bool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {
// DBG_VALUE loc, offset, variable
if (MI->getNumOperands() != 3 ||
@ -551,3 +567,36 @@ LiveDebugVariables::~LiveDebugVariables() {
if (pImpl)
delete static_cast<LDVImpl*>(pImpl);
}
void UserValue::
renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx,
const TargetRegisterInfo *TRI) {
for (unsigned i = 0, e = locations.size(); i != e; ++i) {
Location &Loc = locations[i];
if (Loc.Kind != OldReg)
continue;
Loc.Kind = NewReg;
if (SubIdx && Loc.Data.SubIdx)
Loc.Data.SubIdx = TRI->composeSubRegIndices(SubIdx, Loc.Data.SubIdx);
}
}
void LDVImpl::
renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) {
for (UserValue *UV = lookupVirtReg(OldReg); UV; UV = UV->getNext())
UV->renameRegister(OldReg, NewReg, SubIdx, TRI);
}
void LiveDebugVariables::
renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) {
if (pImpl)
static_cast<LDVImpl*>(pImpl)->renameRegister(OldReg, NewReg, SubIdx);
}
#ifndef NDEBUG
void LiveDebugVariables::dump() {
if (pImpl)
static_cast<LDVImpl*>(pImpl)->print(dbgs());
}
#endif

View File

@ -44,6 +44,9 @@ public:
/// that happened during register allocation.
void emitDebugValues();
/// dump - Print data structures to dbgs().
void dump();
private:
virtual bool runOnMachineFunction(MachineFunction &);

View File

@ -696,6 +696,9 @@ SimpleRegisterCoalescing::UpdateRegDefsUses(const CoalescerPair &CP) {
unsigned DstReg = CP.getDstReg();
unsigned SubIdx = CP.getSubIdx();
// Update LiveDebugVariables.
ldv_->renameRegister(SrcReg, DstReg, SubIdx);
for (MachineRegisterInfo::reg_iterator I = mri_->reg_begin(SrcReg);
MachineInstr *UseMI = I.skipInstruction();) {
// A PhysReg copy that won't be coalesced can perhaps be rematerialized
@ -1779,6 +1782,7 @@ bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) {
}
DEBUG(dump());
DEBUG(ldv_->dump());
return true;
}