Do a separate pass to compute spill weights because doing it inline
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Wed, 24 Dec 2003 15:44:53 +0000 (15:44 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Wed, 24 Dec 2003 15:44:53 +0000 (15:44 +0000)
with live intervals was missing registers that were used before they
were defined (in the arbitrary order live intervals numbers
instructions).

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

lib/CodeGen/LiveIntervalAnalysis.cpp

index e4b134bc9d5bb6a922a7165cff73e02c67a378b2..b34a65bc6443577dbd6b3b614ae86e52de804cde 100644 (file)
@@ -106,6 +106,33 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
 
     computeIntervals();
 
+    // compute spill weights
+    const LoopInfo& loopInfo = getAnalysis<LoopInfo>();
+
+    for (MbbIndex2MbbMap::iterator
+             it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end();
+         it != itEnd; ++it) {
+        MachineBasicBlock* mbb = it->second;
+
+        unsigned loopDepth = loopInfo.getLoopDepth(mbb->getBasicBlock());
+
+        for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end();
+             mi != miEnd; ++mi) {
+            MachineInstr* instr = *mi;
+            for (int i = instr->getNumOperands() - 1; i >= 0; --i) {
+                MachineOperand& mop = instr->getOperand(i);
+
+                if (!mop.isVirtualRegister())
+                    continue;
+
+                unsigned reg = mop.getAllocatedRegNum();
+                Reg2IntervalMap::iterator r2iit = r2iMap_.find(reg);
+                assert(r2iit != r2iMap_.end());
+                intervals_[r2iit->second].weight += pow(10.0F, loopDepth);
+            }
+        }
+    }
+
     return true;
 }
 
@@ -255,8 +282,6 @@ void LiveIntervals::computeIntervals()
 {
     DEBUG(std::cerr << "computing live intervals:\n");
 
-    const LoopInfo& loopInfo = getAnalysis<LoopInfo>();
-
     for (MbbIndex2MbbMap::iterator
              it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end();
          it != itEnd; ++it) {
@@ -264,8 +289,6 @@ void LiveIntervals::computeIntervals()
         DEBUG(std::cerr << "machine basic block: "
               << mbb->getBasicBlock()->getName() << "\n");
 
-        unsigned loopDepth = loopInfo.getLoopDepth(mbb->getBasicBlock());
-
         for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end();
              mi != miEnd; ++mi) {
             MachineInstr* instr = *mi;
@@ -296,12 +319,6 @@ void LiveIntervals::computeIntervals()
                     else
                         handleVirtualRegisterDef(mbb, mi, reg);
                 }
-
-                // update weights
-                Reg2IntervalMap::iterator r2iit = r2iMap_.find(reg);
-                if (r2iit != r2iMap_.end() &&
-                    reg >= MRegisterInfo::FirstVirtualRegister)
-                    intervals_[r2iit->second].weight += pow(10.0F, loopDepth);
             }
         }
     }