Skip to content

Commit 05cae83

Browse files
committed
Classify value numbers into connected components in linear time.
llvm-svn: 116105
1 parent 163488f commit 05cae83

File tree

1 file changed

+15
-23
lines changed

1 file changed

+15
-23
lines changed

llvm/lib/CodeGen/LiveInterval.cpp

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -709,47 +709,39 @@ void LiveRange::print(raw_ostream &os) const {
709709
/// multiple LiveIntervals.
710710

711711
void ConnectedVNInfoEqClasses::Connect(unsigned a, unsigned b) {
712-
// Add new eq classes as needed.
713-
for (unsigned i = eqClass_.size(), m = std::max(a, b); i <= m; ++i)
714-
eqClass_.push_back(i);
715-
716712
unsigned eqa = eqClass_[a];
717713
unsigned eqb = eqClass_[b];
718714
if (eqa == eqb)
719715
return;
716+
// Make sure a and b are in the same class while maintaining eqClass_[i] <= i.
720717
if (eqa > eqb)
721-
std::swap(eqa, eqb);
722-
// Now, eqa < eqb. Switch all eqb members over to eqa.
723-
for (unsigned i = eqb, e = eqClass_.size(); i != e; ++i)
724-
if (eqClass_[i] == eqb)
725-
eqClass_[i] = eqa;
718+
eqClass_[a] = eqb;
719+
else
720+
eqClass_[b] = eqa;
726721
}
727722

728723
unsigned ConnectedVNInfoEqClasses::Renumber() {
729-
// No values at all.
730-
if (eqClass_.empty())
731-
return 0;
732-
733-
// Common case: A single connected component.
734-
if (eqClass_.back() == 0)
735-
return 1;
736-
737-
// Renumber classes. We use the fact that eqClass_[i] == i for class leaders.
724+
// Assign final class numbers.
725+
// We use the fact that eqClass_[i] == i for class leaders.
726+
// For others, eqClass_[i] points to an earlier value in the same class.
738727
unsigned count = 0;
739728
for (unsigned i = 0, e = eqClass_.size(); i != e; ++i) {
740729
unsigned q = eqClass_[i];
741-
if (q == i)
742-
eqClass_[i] = count++;
743-
else
744-
eqClass_[i] = eqClass_[q];
730+
assert(q <= i && "Invariant broken");
731+
eqClass_[i] = q == i ? count++ : eqClass_[q];
745732
}
746733

747734
return count;
748735
}
749736

750737
unsigned ConnectedVNInfoEqClasses::Classify(const LiveInterval *LI) {
751-
// Determine connections.
738+
// Create initial equivalence classes.
752739
eqClass_.clear();
740+
eqClass_.reserve(LI->getNumValNums());
741+
for (unsigned i = 0, e = LI->getNumValNums(); i != e; ++i)
742+
eqClass_.push_back(i);
743+
744+
// Determine connections.
753745
for (LiveInterval::const_vni_iterator I = LI->vni_begin(), E = LI->vni_end();
754746
I != E; ++I) {
755747
const VNInfo *VNI = *I;

0 commit comments

Comments
 (0)