[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