Add LiveInterval::RenumberValues - Garbage collection for VNInfos.

After heavy editing of a live interval, it is much easier to simply renumber the
live values instead of trying to keep track of the unused ones.

llvm-svn: 110463
This commit is contained in:
Jakob Stoklund Olesen 2010-08-06 18:46:59 +00:00
parent a7aed18624
commit 8c0f693150
3 changed files with 22 additions and 1 deletions

View File

@ -336,6 +336,10 @@ namespace llvm {
return VNI;
}
/// RenumberValues - Renumber all values in order of appearance and remove
/// unused values.
void RenumberValues();
/// isOnlyLROfValNo - Return true if the specified live range is the only
/// one defined by the its val#.
bool isOnlyLROfValNo(const LiveRange *LR) {

View File

@ -180,6 +180,21 @@ void LiveInterval::markValNoForDeletion(VNInfo *ValNo) {
}
}
/// RenumberValues - Renumber all values in order of appearance and delete the
/// remaining unused values.
void LiveInterval::RenumberValues() {
SmallPtrSet<VNInfo*, 8> Seen;
valnos.clear();
for (const_iterator I = begin(), E = end(); I != E; ++I) {
VNInfo *VNI = I->valno;
if (!Seen.insert(VNI))
continue;
assert(!VNI->isUnused() && "Unused valno used by live range");
VNI->id = (unsigned)valnos.size();
valnos.push_back(VNI);
}
}
/// extendIntervalEndTo - This method is used when we want to extend the range
/// specified by I to end at the specified endpoint. To do this, we should
/// merge and eliminate all ranges that this will overlap with. The iterator is

View File

@ -553,8 +553,10 @@ void SplitEditor::rewrite() {
}
// dupli_ goes in last, after rewriting.
if (dupli_)
if (dupli_) {
dupli_->RenumberValues();
intervals_.push_back(dupli_);
}
// FIXME: *Calculate spill weights, allocation hints, and register classes for
// firstInterval..