From: Lang Hames Date: Thu, 9 Feb 2012 04:45:38 +0000 (+0000) Subject: Fix kill flags when moving instructions using LiveIntervals::moveInstr(...). X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=fb08b90bf402bcd08a3474772d505294d9d7aa79;p=oota-llvm.git Fix kill flags when moving instructions using LiveIntervals::moveInstr(...). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150150 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 5c3b57fda51..1d5e3b1be75 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -854,9 +854,21 @@ static void handleMoveECs(LiveIntervals& lis, SlotIndex origIdx, } } +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 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 @@ static void handleMoveUses(const MachineBasicBlock *mbb, 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 @@ static void handleMoveUses(const MachineBasicBlock *mbb, } 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 @@ void LiveIntervals::moveInstr(MachineBasicBlock::iterator insertPt, // 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 @@ void LiveIntervals::moveInstr(MachineBasicBlock::iterator insertPt, 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 @@ void LiveIntervals::moveInstr(MachineBasicBlock::iterator insertPt, 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); } }