mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-07 14:33:15 +00:00
Classify value numbers into connected components in linear time.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116105 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ff9dfedd10
commit
54f32e6575
@ -709,47 +709,39 @@ void LiveRange::print(raw_ostream &os) const {
|
|||||||
/// multiple LiveIntervals.
|
/// multiple LiveIntervals.
|
||||||
|
|
||||||
void ConnectedVNInfoEqClasses::Connect(unsigned a, unsigned b) {
|
void ConnectedVNInfoEqClasses::Connect(unsigned a, unsigned b) {
|
||||||
// Add new eq classes as needed.
|
|
||||||
for (unsigned i = eqClass_.size(), m = std::max(a, b); i <= m; ++i)
|
|
||||||
eqClass_.push_back(i);
|
|
||||||
|
|
||||||
unsigned eqa = eqClass_[a];
|
unsigned eqa = eqClass_[a];
|
||||||
unsigned eqb = eqClass_[b];
|
unsigned eqb = eqClass_[b];
|
||||||
if (eqa == eqb)
|
if (eqa == eqb)
|
||||||
return;
|
return;
|
||||||
|
// Make sure a and b are in the same class while maintaining eqClass_[i] <= i.
|
||||||
if (eqa > eqb)
|
if (eqa > eqb)
|
||||||
std::swap(eqa, eqb);
|
eqClass_[a] = eqb;
|
||||||
// Now, eqa < eqb. Switch all eqb members over to eqa.
|
else
|
||||||
for (unsigned i = eqb, e = eqClass_.size(); i != e; ++i)
|
eqClass_[b] = eqa;
|
||||||
if (eqClass_[i] == eqb)
|
|
||||||
eqClass_[i] = eqa;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned ConnectedVNInfoEqClasses::Renumber() {
|
unsigned ConnectedVNInfoEqClasses::Renumber() {
|
||||||
// No values at all.
|
// Assign final class numbers.
|
||||||
if (eqClass_.empty())
|
// We use the fact that eqClass_[i] == i for class leaders.
|
||||||
return 0;
|
// For others, eqClass_[i] points to an earlier value in the same class.
|
||||||
|
|
||||||
// Common case: A single connected component.
|
|
||||||
if (eqClass_.back() == 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
// Renumber classes. We use the fact that eqClass_[i] == i for class leaders.
|
|
||||||
unsigned count = 0;
|
unsigned count = 0;
|
||||||
for (unsigned i = 0, e = eqClass_.size(); i != e; ++i) {
|
for (unsigned i = 0, e = eqClass_.size(); i != e; ++i) {
|
||||||
unsigned q = eqClass_[i];
|
unsigned q = eqClass_[i];
|
||||||
if (q == i)
|
assert(q <= i && "Invariant broken");
|
||||||
eqClass_[i] = count++;
|
eqClass_[i] = q == i ? count++ : eqClass_[q];
|
||||||
else
|
|
||||||
eqClass_[i] = eqClass_[q];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned ConnectedVNInfoEqClasses::Classify(const LiveInterval *LI) {
|
unsigned ConnectedVNInfoEqClasses::Classify(const LiveInterval *LI) {
|
||||||
// Determine connections.
|
// Create initial equivalence classes.
|
||||||
eqClass_.clear();
|
eqClass_.clear();
|
||||||
|
eqClass_.reserve(LI->getNumValNums());
|
||||||
|
for (unsigned i = 0, e = LI->getNumValNums(); i != e; ++i)
|
||||||
|
eqClass_.push_back(i);
|
||||||
|
|
||||||
|
// Determine connections.
|
||||||
for (LiveInterval::const_vni_iterator I = LI->vni_begin(), E = LI->vni_end();
|
for (LiveInterval::const_vni_iterator I = LI->vni_begin(), E = LI->vni_end();
|
||||||
I != E; ++I) {
|
I != E; ++I) {
|
||||||
const VNInfo *VNI = *I;
|
const VNInfo *VNI = *I;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user