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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58560 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2008-11-02 08:08:18 +00:00
parent 2b82b7e77e
commit 6423c6c0e8

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)