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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110463 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen 2010-08-06 18:46:59 +00:00
parent 90c579de5a
commit 23436597a8
3 changed files with 22 additions and 1 deletions

View File

@ -336,6 +336,10 @@ namespace llvm {
return VNI; 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 /// isOnlyLROfValNo - Return true if the specified live range is the only
/// one defined by the its val#. /// one defined by the its val#.
bool isOnlyLROfValNo(const LiveRange *LR) { 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 /// 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 /// 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 /// 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. // dupli_ goes in last, after rewriting.
if (dupli_) if (dupli_) {
dupli_->RenumberValues();
intervals_.push_back(dupli_); intervals_.push_back(dupli_);
}
// FIXME: *Calculate spill weights, allocation hints, and register classes for // FIXME: *Calculate spill weights, allocation hints, and register classes for
// firstInterval.. // firstInterval..