Add a LiveRangeEdit delegate callback before shrinking a live range.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 16 Mar 2011 22:56:16 +0000 (22:56 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 16 Mar 2011 22:56:16 +0000 (22:56 +0000)
The register allocator needs to adjust its live interval unions when that happens.

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

lib/CodeGen/LiveRangeEdit.cpp
lib/CodeGen/LiveRangeEdit.h
lib/CodeGen/RegAllocGreedy.cpp

index e994d8c32d49832238f3644d8230dbf744ec2e14..489d88c1dfbd251c71110e8060a93ef35176a092 100644 (file)
@@ -201,8 +201,11 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
       break;
 
     // Shrink just one live interval. Then delete new dead defs.
-    LIS.shrinkToUses(ToShrink.back(), &Dead);
+    LiveInterval *LI = ToShrink.back();
     ToShrink.pop_back();
+    if (delegate_)
+      delegate_->LRE_WillShrinkVirtReg(LI->reg);
+    LIS.shrinkToUses(LI, &Dead);
   }
 }
 
index a784826e95f8fcc06c2481775c28c37190cec3b4..2bd34611c24e36fbb30a5b1d15a7e25c8c0958fe 100644 (file)
@@ -39,6 +39,9 @@ public:
     /// its deletion from LiveIntervals.
     virtual bool LRE_CanEraseVirtReg(unsigned) { return true; }
 
+    /// Called before shrinking the live range of a virtual register.
+    virtual void LRE_WillShrinkVirtReg(unsigned) {}
+
     virtual ~Delegate() {}
   };
 
index 940ed814652e538aa063160f9fbdcf837eb51b89..6feae4790d0a5ee5741579416b026b9399cee4d0 100644 (file)
@@ -162,6 +162,7 @@ public:
 private:
   void LRE_WillEraseInstruction(MachineInstr*);
   bool LRE_CanEraseVirtReg(unsigned);
+  void LRE_WillShrinkVirtReg(unsigned);
 
   bool checkUncachedInterference(LiveInterval&, unsigned);
   LiveInterval *getSingleInterference(LiveInterval&, unsigned);
@@ -260,6 +261,17 @@ bool RAGreedy::LRE_CanEraseVirtReg(unsigned VirtReg) {
   return false;
 }
 
+void RAGreedy::LRE_WillShrinkVirtReg(unsigned VirtReg) {
+  unsigned PhysReg = VRM->getPhys(VirtReg);
+  if (!PhysReg)
+    return;
+
+  // Register is assigned, put it back on the queue for reassignment.
+  LiveInterval &LI = LIS->getInterval(VirtReg);
+  unassign(LI, PhysReg);
+  enqueue(&LI);
+}
+
 void RAGreedy::releaseMemory() {
   SpillerInstance.reset(0);
   LRStage.clear();