mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 23:18:58 +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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293934 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e14e1120ed
commit
5340452c64
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user