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

Quentin Colombet via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 2 12:44:37 PST 2017

Author: qcolombet
Date: Thu Feb  2 14:44:36 2017
New Revision: 293934

URL: http://llvm.org/viewvc/llvm-project?rev=293934&view=rev
[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 at ericsson.com> for noticing and
reporting the problem.


Modified: llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp?rev=293934&r1=293933&r2=293934&view=diff
--- llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp Thu Feb  2 14:44:36 2017
@@ -37,6 +37,8 @@ LiveInterval &LiveRangeEdit::createEmpty
     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(unsig
   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_NoteNewVirtualRegiste
   if (VRM)
-  if (Parent && !Parent->isSpillable())
-    LIS.getInterval(VReg).markNotSpillable();

More information about the llvm-commits mailing list