@@ -709,47 +709,39 @@ void LiveRange::print(raw_ostream &os) const {
709
709
// / multiple LiveIntervals.
710
710
711
711
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
-
716
712
unsigned eqa = eqClass_[a];
717
713
unsigned eqb = eqClass_[b];
718
714
if (eqa == eqb)
719
715
return ;
716
+ // Make sure a and b are in the same class while maintaining eqClass_[i] <= i.
720
717
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;
726
721
}
727
722
728
723
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.
738
727
unsigned count = 0 ;
739
728
for (unsigned i = 0 , e = eqClass_.size (); i != e; ++i) {
740
729
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];
745
732
}
746
733
747
734
return count;
748
735
}
749
736
750
737
unsigned ConnectedVNInfoEqClasses::Classify (const LiveInterval *LI) {
751
- // Determine connections .
738
+ // Create initial equivalence classes .
752
739
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.
753
745
for (LiveInterval::const_vni_iterator I = LI->vni_begin (), E = LI->vni_end ();
754
746
I != E; ++I) {
755
747
const VNInfo *VNI = *I;
0 commit comments