mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:50:30 +00:00
[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:
parent
4a9bcf6ca7
commit
780b512e18
@ -37,6 +37,8 @@ LiveInterval &LiveRangeEdit::createEmptyIntervalFrom(unsigned OldReg) {
|
|||||||
VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
|
VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
|
||||||
}
|
}
|
||||||
LiveInterval &LI = LIS.createEmptyInterval(VReg);
|
LiveInterval &LI = LIS.createEmptyInterval(VReg);
|
||||||
|
if (Parent && !Parent->isSpillable())
|
||||||
|
LI.markNotSpillable();
|
||||||
// Create empty subranges if the OldReg's interval has them. Do not create
|
// 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
|
// the main range here---it will be constructed later after the subranges
|
||||||
// have been finalized.
|
// have been finalized.
|
||||||
@ -52,6 +54,14 @@ unsigned LiveRangeEdit::createFrom(unsigned OldReg) {
|
|||||||
if (VRM) {
|
if (VRM) {
|
||||||
VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
|
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;
|
return VReg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,9 +452,6 @@ LiveRangeEdit::MRI_NoteNewVirtualRegister(unsigned VReg)
|
|||||||
if (VRM)
|
if (VRM)
|
||||||
VRM->grow();
|
VRM->grow();
|
||||||
|
|
||||||
if (Parent && !Parent->isSpillable())
|
|
||||||
LIS.getInterval(VReg).markNotSpillable();
|
|
||||||
|
|
||||||
NewRegs.push_back(VReg);
|
NewRegs.push_back(VReg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user