[llvm-commits] [llvm] r150150 - /llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp

Lang Hames lhames at gmail.com
Wed Feb 8 20:45:38 PST 2012


Author: lhames
Date: Wed Feb  8 22:45:38 2012
New Revision: 150150

URL: http://llvm.org/viewvc/llvm-project?rev=150150&view=rev
Log:
Fix kill flags when moving instructions using LiveIntervals::moveInstr(...).

Modified:
    llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp

Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=150150&r1=150149&r2=150150&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Wed Feb  8 22:45:38 2012
@@ -854,9 +854,21 @@
   }
 }
 
+static void moveKillFlags(unsigned reg, SlotIndex oldIdx, SlotIndex newIdx,
+                          LiveIntervals& lis,
+                          const TargetRegisterInfo& tri) {
+  MachineInstr* oldKillMI = lis.getInstructionFromIndex(oldIdx);
+  MachineInstr* newKillMI = lis.getInstructionFromIndex(newIdx);
+  assert(oldKillMI->killsRegister(reg) && "Old 'kill' instr isn't a kill.");
+  assert(!newKillMI->killsRegister(reg) && "New kill instr is already a kill.");
+  oldKillMI->clearRegisterKills(reg, &tri);
+  newKillMI->addRegisterKilled(reg, &tri);
+}
+
 template <typename UseSetT>
 static void handleMoveUses(const MachineBasicBlock *mbb,
                            const MachineRegisterInfo& mri,
+                           const TargetRegisterInfo& tri,
                            const BitVector& reservedRegs, LiveIntervals &lis,
                            SlotIndex origIdx, SlotIndex miIdx,
                            const UseSetT &uses) {
@@ -887,10 +899,15 @@
           const MachineOperand& mop = useI.getOperand();
           SlotIndex instSlot = lis.getSlotIndexes()->getInstructionIndex(mopI);
           SlotIndex opSlot = instSlot.getRegSlot(mop.isEarlyClobber());
-          if (opSlot >= lastUseInRange && opSlot < origIdx) {
+          if (opSlot > lastUseInRange && opSlot < origIdx)
             lastUseInRange = opSlot;
-          }
         }
+
+        // If we found a new instr endpoint update the kill flags.
+        if (lastUseInRange != miIdx.getRegSlot())
+          moveKillFlags(use, miIdx, lastUseInRange, lis, tri);
+
+        // Fix up the range end.
         lr->end = lastUseInRange;
       }
     } else {
@@ -902,6 +919,7 @@
       } else {
         bool liveOut = lr->end >= lis.getSlotIndexes()->getMBBEndIdx(mbb);
         if (!liveOut && miIdx.getRegSlot() > lr->end) {
+          moveKillFlags(use, lr->end, miIdx, lis, tri);
           lr->end = miIdx.getRegSlot();
         }
       }
@@ -923,8 +941,7 @@
 
   // Move the machine instr and obtain its new index.
   indexes_->removeMachineInstrFromMaps(mi);
-  mbb->remove(mi);
-  mbb->insert(insertPt, mi);
+  mbb->splice(insertPt, mbb, mi);
   SlotIndex miIdx = indexes_->insertMachineInstrInMaps(mi);
 
   // Pick the direction.
@@ -961,7 +978,7 @@
   BitVector reservedRegs(tri_->getReservedRegs(*mbb->getParent()));
 
   if (movingUp) {
-    handleMoveUses(mbb, *mri_, reservedRegs, *this, origIdx, miIdx, uses);
+    handleMoveUses(mbb, *mri_, *tri_, reservedRegs, *this, origIdx, miIdx, uses);
     handleMoveECs(*this, origIdx, miIdx, ecs);
     handleMoveDeadDefs(*this, origIdx, miIdx, deadDefs);
     handleMoveDefs(*this, origIdx, miIdx, defs);
@@ -969,7 +986,7 @@
     handleMoveDefs(*this, origIdx, miIdx, defs);
     handleMoveDeadDefs(*this, origIdx, miIdx, deadDefs);
     handleMoveECs(*this, origIdx, miIdx, ecs);
-    handleMoveUses(mbb, *mri_, reservedRegs, *this, origIdx, miIdx, uses);
+    handleMoveUses(mbb, *mri_, *tri_, reservedRegs, *this, origIdx, miIdx, uses);
   }
 }
 





More information about the llvm-commits mailing list