Start using the iterators in the fixed_ intervals to avoid having to binary
authorChris Lattner <sabre@nondot.org>
Thu, 18 Nov 2004 04:13:02 +0000 (04:13 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 18 Nov 2004 04:13:02 +0000 (04:13 +0000)
search physreg intervals every time we access it.  This takes another
half second off of linscan.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17937 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocLinearScan.cpp

index 651e25a56072e8a7dd11a17a654a3a0a5708807b..0cb30430a37b92faa76bf22d71f354e2f846b15f 100644 (file)
@@ -292,6 +292,7 @@ void RA::processActiveIntervals(unsigned CurPoint)
 void RA::processInactiveIntervals(unsigned CurPoint)
 {
   DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
+
   for (unsigned i = 0, e = inactive_.size(); i != e; ++i) {
     LiveInterval *Interval = inactive_[i].first;
     LiveInterval::iterator IntervalPos = inactive_[i].second;
@@ -363,6 +364,8 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur)
 
   spillWeights_.assign(mri_->getNumRegs(), 0.0);
 
+  unsigned StartPosition = cur->beginNumber();
+
   // for each interval in active update spill weights
   for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end();
        i != e; ++i) {
@@ -387,13 +390,17 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur)
 
   // For every interval in fixed we overlap with, mark the register as not free
   // and update spill weights.
-  for (IntervalPtrs::const_iterator i = fixed_.begin(),
-         e = fixed_.end(); i != e; ++i)
-    if (cur->overlapsFrom(*i->first, i->second)) {
-      unsigned reg = i->first->reg;
+  for (unsigned i = 0, e = fixed_.size(); i != e; ++i) {
+    IntervalPtr &IP = fixed_[i];
+    LiveInterval *I = IP.first;
+    LiveInterval::iterator II = I->advanceTo(IP.second, StartPosition);
+    IP.second = II;
+    if (cur->overlapsFrom(*I, II)) {
+      unsigned reg = I->reg;
       prt_->addRegUse(reg);
-      updateSpillWeights(reg, i->first->weight);
+      updateSpillWeights(reg, I->weight);
     }
+  }
 
   unsigned physReg = getFreePhysReg(cur);
   // restore the physical register tracker