Disentangle moving a machine instr from updating LiveIntervals.

llvm-svn: 150552
This commit is contained in:
Lang Hames 2012-02-15 01:23:52 +00:00
parent c62bb39142
commit 77d205152a
3 changed files with 14 additions and 17 deletions

View File

@ -280,10 +280,11 @@ namespace llvm {
/// register.
void addKillFlags();
/// moveInstr - Move MachineInstr mi to insertPt, updating the live
/// intervals of mi's operands to reflect the new position. The insertion
/// point can be above or below mi, but must be in the same basic block.
void moveInstr(MachineBasicBlock::iterator insertPt, MachineInstr* mi);
/// handleMove - call this method to notify LiveIntervals that
/// instruction 'mi' has been moved within a basic block. This will update
/// the live intervals for all operands of mi. Moves between basic blocks
/// are not supported.
void handleMove(MachineInstr* mi);
// Register mask functions.
//

View File

@ -963,22 +963,17 @@ static void handleMoveUses(const MachineBasicBlock *mbb,
}
}
void LiveIntervals::moveInstr(MachineBasicBlock::iterator insertPt,
MachineInstr *mi) {
MachineBasicBlock* mbb = mi->getParent();
assert((insertPt == mbb->end() || insertPt->getParent() == mbb) &&
"Cannot handle moves across basic block boundaries.");
assert(&*insertPt != mi && "No-op move requested?");
assert(!mi->isBundled() && "Can't handle bundled instructions yet.");
// Grab the original instruction index.
void LiveIntervals::handleMove(MachineInstr *mi) {
SlotIndex origIdx = indexes_->getInstructionIndex(mi);
// Move the machine instr and obtain its new index.
indexes_->removeMachineInstrFromMaps(mi);
mbb->splice(insertPt, mbb, mi);
SlotIndex miIdx = indexes_->insertMachineInstrInMaps(mi);
MachineBasicBlock* mbb = mi->getParent();
assert(getMBBFromIndex(origIdx) == mbb &&
"Cannot handle moves across basic block boundaries.");
assert(!mi->isBundled() && "Can't handle bundled instructions yet.");
// Pick the direction.
bool movingUp = miIdx < origIdx;

View File

@ -229,7 +229,8 @@ void ScheduleTopDownLive::Schedule() {
if (&*InsertPos == MI)
++InsertPos;
else {
Pass->LIS->moveInstr(InsertPos, MI);
BB->splice(InsertPos, BB, MI);
Pass->LIS->handleMove(MI);
if (Begin == InsertPos)
Begin = MI;
}