Don't do pre-splitting if doing so would create a value join that did not

exist before.  Updating the live intervals in that care is tricky in the general
case.

Evan, if you see a tighter guard condition for this, let me know.

llvm-svn: 58560
This commit is contained in:
Owen Anderson 2008-11-02 08:08:18 +00:00
parent 0433be6feb
commit 2bb2aaa775
1 changed files with 10 additions and 0 deletions

View File

@ -89,6 +89,8 @@ namespace {
AU.addPreservedID(StrongPHIEliminationID);
else
AU.addPreservedID(PHIEliminationID);
AU.addRequired<MachineLoopInfo>();
AU.addPreserved<MachineLoopInfo>();
MachineFunctionPass::getAnalysisUsage(AU);
}
@ -633,6 +635,14 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
assert(0 && "Val# is defined by a dead def?");
abort();
}
// Pre-splitting a vreg that does not have a PHI kill across a barrier
// that is within a loop can potentially create a join that was not
// present before, which would make updating the live intervals very
// difficult. Bailout instead.
MachineLoopInfo& MLI = getAnalysis<MachineLoopInfo>();
if (!ValNo->hasPHIKill && MLI.getLoopFor(BarrierMBB))
return false;
// FIXME: For now, if definition is rematerializable, do not split.
MachineInstr *DefMI = (ValNo->def != ~0U)