<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hi,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I opened the bug #31122 for this issue.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>There are two parts to this problem. Compiled using "llc -debug-only=regalloc test.ll", the test case attached to the bug fails with<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>VirtRegMap.h:119: void llvm::VirtRegMap::clearVirt(unsigned int): Assertion `Virt2PhysMap[virtReg] != NO_PHYS_REG && "attempt to clear a not assigned virtual register"' failed.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The code looks like:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>       %vreg647<def> = COPY %vreg645; QQQQPR_with_dsub_7_then_ssub_0:%vreg647 QQQQPR:%vreg645<o:p></o:p></p><p class=MsoNormal>        %vreg657<def> = COPY %vreg655; QQQQPR_with_dsub_7_then_ssub_0:%vreg657 QQQQPR:%vreg655<o:p></o:p></p><p class=MsoNormal>        %vreg679<def> = COPY %vreg678; QPR_VFP2:%vreg679 QPR:%vreg678<o:p></o:p></p><p class=MsoNormal>        %vreg657:dsub_7_then_ssub_0<def> = VDIVS %vreg679:ssub_2, %vreg647:dsub_7_then_ssub_0, pred:14, pred:%noreg; QQQQPR_with_dsub_7_then_ssub_0:%vreg657,%vreg647 QPR_VFP2:%vreg679<o:p></o:p></p><p class=MsoNormal>        %vreg659<def> = COPY %vreg657; QQQQPR:%vreg659 QQQQPR_with_dsub_7_then_ssub_0:%vreg657<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This problem occurs during last chance recoloring, where %vreg679 doesn’t get allocated (and is marked as not spillable), so last chance recoloring kicks in.  It tries to allocate Q0 to %vreg679, where Q0_Q1_Q2_Q3 is assigned to %vreg647, which interferes with %vreg679.  Upon trying to allocate a register to %vreg647, %vreg679 gets evicted from Q0.  But %vreg679 is a fixed register, so it shouldn’t get evicted.  Recoloring is thus deemed successful, and upon returning from tryRecoloringCandidates, we assert when trying to unassign %vreg679.  <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I can get around this by moving the virtual register under consideration in tryLastChanceRecoloring (%vreg679) to RS_Done stage right before the call to tryRecolringCandidates, and then restoring the original stage afterward.  This prevents the eviction of %vreg679 during recoloring.   Alternatively, I can check FixedRegisters in canEvictInterference and return false.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>After the assert is gone, I run into “LLVM ERROR: ran out of registers during register allocation”.  Increasing lcr-max-depth doesn’t help.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>To get past this error, I am thinking about spilling an actual physical register if last chance recoloring fails.  For example,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>P = ….<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>virtX = …. Last chance recoloring fails, <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>… = P<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>…. = virtX<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>will result in something along the lines of<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>P = ….<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>spill P to fi#0 (original P)<o:p></o:p></p><p class=MsoNormal>P = …. (virtX is now in P)<o:p></o:p></p><p class=MsoNormal>….<o:p></o:p></p><p class=MsoNormal>Spill P to fi#1 (this is virtX)<o:p></o:p></p><p class=MsoNormal>Reload P form from fi#0 (original P)<o:p></o:p></p><p class=MsoNormal>… = P<o:p></o:p></p><p class=MsoNormal>….<o:p></o:p></p><p class=MsoNormal>Reload P from fi#1 (this is virtX)<o:p></o:p></p><p class=MsoNormal> = P<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Does anyone have any other suggestions about dealing with this problem?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thank you,<o:p></o:p></p><p class=MsoNormal>Sanjin<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>