[LLVMdev] "Ran out of registers during register allocation" bug affecting ffmpeg
Jakob Stoklund Olesen
stoklund at 2pi.dk
Mon Aug 30 17:52:43 PDT 2010
On Aug 21, 2010, at 5:27 PM, Eli Friedman wrote:
> See http://llvm.org/bugs/show_bug.cgi?id=4668 and
> http://llvm.org/bugs/show_bug.cgi?id=5010. The basic description of
> the issue (from http://llvm.org/bugs/show_bug.cgi?id=4668#c5): "The
> fundamental problem is we can't spill a register once it's fixed to a
> physical register."
>> From discussion on IRC:
> [17:14] <_sabre_> efriedma: sounds like a RA bug in linscan
> [17:14] <_sabre_> unfortunately, it is a fairly well known bug that is
> difficult to fix
> [17:14] <_sabre_> it would be worth bringing up on llvmdev, there may
> be a good approach since I stopped looking at the regalloc
> [17:14] <_sabre_> in any case, its worth surfacing the issue so that
> Jakob can keep it in mind as he's building the new RA infrastructure
I am not sure I completely understand the problem here since the PRs don't reproduce on TOT, but it sounds like a physical register is live across an inline asm that needs all the registers.
This can happen if the register coalescer decides to coalesce a physreg with a virtreg that is live across the inline asm. This is not easy to detect without a bad compile time regression.
I suppose something similar could happen for calls. For instance, some calls clobber all XMM registers, so a physical XMM register coalesced to be live across a call would be unspillable.
What can I say? Physreg coalescing is evil ;-)
I want to remove physreg coalescing entirely, but it requires the register allocator to be really good at taking hints. We are not quite there yet.
A quick fix would be to disable physreg coalescing for functions containing inline asm.
More information about the llvm-dev