From 365b95fbbc80c58d9d40a44b6d8a0330cc9d1bfe Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 18 Nov 2004 04:13:02 +0000 Subject: [PATCH] Start using the iterators in the fixed_ intervals to avoid having to binary 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 | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp index 651e25a5607..0cb30430a37 100644 --- a/lib/CodeGen/RegAllocLinearScan.cpp +++ b/lib/CodeGen/RegAllocLinearScan.cpp @@ -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