Add support for updating the LiveIntervals of registers used by 'exotic'

terminators that actually have register uses when splitting critical edges.

This commit also introduces a method repairIntervalsInRange() on LiveIntervals,
which allows for repairing LiveIntervals in a small range after an arbitrary
target hook modifies, inserts, and removes instructions. It's pretty limited
right now, but I hope to extend it to support all of the things that are done
by the convertToThreeAddress() target hooks.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175382 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Cameron Zwarich
2013-02-17 00:10:44 +00:00
parent cc54889cd5
commit f0b2535344
3 changed files with 80 additions and 0 deletions

View File

@@ -698,6 +698,24 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
}
}
SmallVector<unsigned, 4> UsedRegs;
if (LIS) {
for (instr_iterator I = getFirstInstrTerminator(), E = instr_end();
I != E; ++I) {
MachineInstr *MI = I;
for (MachineInstr::mop_iterator OI = MI->operands_begin(),
OE = MI->operands_end(); OI != OE; ++OI) {
if (!OI->isReg() || OI->getReg() == 0)
continue;
unsigned Reg = OI->getReg();
if (std::find(UsedRegs.begin(), UsedRegs.end(), Reg) == UsedRegs.end())
UsedRegs.push_back(Reg);
}
}
}
ReplaceUsesOfBlockWith(Succ, NMBB);
// If updateTerminator() removes instructions, we need to remove them from
@@ -830,6 +848,17 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
LI.removeRange(StartIndex, EndIndex);
}
}
// Update all intervals for registers whose uses may have been modified by
// updateTerminator().
iterator FirstTerminator = getFirstTerminator();
MachineInstr *FirstTerminatorMI = FirstTerminator;
if (FirstTerminatorMI->isBundled())
FirstTerminatorMI = getBundleStart(FirstTerminatorMI);
reverse_iterator PreTerminators =
(FirstTerminator == begin()) ? rend()
: reverse_iterator(FirstTerminatorMI);
LIS->repairIntervalsInRange(this, rbegin(), PreTerminators, UsedRegs);
}
if (MachineDominatorTree *MDT =