[LiveRangeEdit] Don't mess up with LiveInterval when a new vreg is created.

In r283838, we added the capability of splitting unspillable register.
When doing so we had to make sure the split live-ranges were also
unspillable and we did that by marking the related live-ranges in the
delegate method that is called when a new vreg is created.
However, by accessing the live-range there, we also triggered their lazy
computation (LiveIntervalAnalysis::getInterval) which is not what we
want in general. Indeed, later code in LiveRangeEdit is going to build
the live-ranges this lazy computation may mess up that computation
resulting in assertion failures. Namely, the createEmptyIntervalFrom
method expect that the live-range is going to be empty, not computed.

Thanks to Mikael Holmén <mikael.holmen@ericsson.com> for noticing and
reporting the problem.

llvm-svn: 293934
This commit is contained in:
Quentin Colombet 2017-02-02 20:44:36 +00:00
parent 4a9bcf6ca7
commit 780b512e18

View File

@ -37,6 +37,8 @@ LiveInterval &LiveRangeEdit::createEmptyIntervalFrom(unsigned OldReg) {
VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
}
LiveInterval &LI = LIS.createEmptyInterval(VReg);
if (Parent && !Parent->isSpillable())
LI.markNotSpillable();
// Create empty subranges if the OldReg's interval has them. Do not create
// the main range here---it will be constructed later after the subranges
// have been finalized.
@ -52,6 +54,14 @@ unsigned LiveRangeEdit::createFrom(unsigned OldReg) {
if (VRM) {
VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
}
// FIXME: Getting the interval here actually computes it.
// In theory, this may not be what we want, but in practice
// the createEmptyIntervalFrom API is used when this is not
// the case. Generally speaking we just want to annotate the
// LiveInterval when it gets created but we cannot do that at
// the moment.
if (Parent && !Parent->isSpillable())
LIS.getInterval(VReg).markNotSpillable();
return VReg;
}
@ -442,9 +452,6 @@ LiveRangeEdit::MRI_NoteNewVirtualRegister(unsigned VReg)
if (VRM)
VRM->grow();
if (Parent && !Parent->isSpillable())
LIS.getInterval(VReg).markNotSpillable();
NewRegs.push_back(VReg);
}