Transfer physical register spill info when load / store folding happens.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 11 Mar 2008 21:34:46 +0000 (21:34 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 11 Mar 2008 21:34:46 +0000 (21:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48246 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/VirtRegMap.cpp
lib/CodeGen/VirtRegMap.h

index 79318043a6250d84964182fb573ddb59624be882..d7c5544c366f6a3a6a3d32ec1ff10b9bfd8ba624 100644 (file)
@@ -779,6 +779,7 @@ bool LiveIntervals::tryFoldMemoryOperand(MachineInstr* &MI,
       vrm.virtFolded(Reg, MI, fmi, (VirtRegMap::ModRef)MRInfo);
     vrm.transferSpillPts(MI, fmi);
     vrm.transferRestorePts(MI, fmi);
+    vrm.transferEmergencySpills(MI, fmi);
     mi2iMap_.erase(MI);
     i2miMap_[InstrIdx /InstrSlots::NUM] = fmi;
     mi2iMap_[fmi] = InstrIdx;
index cce36e516284050dc9326f2a9b91b3193da2eb46..3b6612de4ff878a1560cf5e019ebc75fd2e811cf 100644 (file)
@@ -35,6 +35,7 @@
 using namespace llvm;
 
 STATISTIC(NumSpills, "Number of register spills");
+STATISTIC(NumPSpills,"Number of physical register spills");
 STATISTIC(NumReMats, "Number of re-materialization");
 STATISTIC(NumDRM   , "Number of re-materializable defs elided");
 STATISTIC(NumStores, "Number of stores added");
@@ -1079,7 +1080,7 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
         TII->loadRegFromStackSlot(MBB, next(MII), PhysReg, SS, RC);
         MachineInstr *LoadMI = next(MII);
         VRM.addSpillSlotUse(SS, LoadMI);
-        ++NumSpills;
+        ++NumPSpills;
       }
     }
 
index 7ebf31eeff37aacbb8bf3bdf2a643e1cd0c03fa5..63d5b87b26b15049e4c520798a6f1c96f53cd988 100644 (file)
@@ -268,6 +268,8 @@ namespace llvm {
       }
     }
 
+    /// @brief - transfer spill point information from one instruction to
+    /// another.
     void transferSpillPts(MachineInstr *Old, MachineInstr *New) {
       std::map<MachineInstr*,std::vector<std::pair<unsigned,bool> > >::iterator
         I = SpillPt2VirtMap.find(Old);
@@ -343,6 +345,21 @@ namespace llvm {
       return EmergencySpillMap[MI];
     }
 
+    /// @brief - transfer emergency spill information from one instruction to
+    /// another.
+    void transferEmergencySpills(MachineInstr *Old, MachineInstr *New) {
+      std::map<MachineInstr*,std::vector<unsigned> >::iterator I =
+        EmergencySpillMap.find(Old);
+      if (I == EmergencySpillMap.end())
+        return;
+      while (!I->second.empty()) {
+        unsigned virtReg = I->second.back();
+        I->second.pop_back();
+        addEmergencySpill(virtReg, New);
+      }
+      EmergencySpillMap.erase(I);
+    }
+
     /// @brief return or get a emergency spill slot for the register class.
     int getEmergencySpillSlot(const TargetRegisterClass *RC);