[LLVMdev] LLVM ERROR: ran out of registers during register allocation
Jakob Stoklund Olesen
stoklund at 2pi.dk
Mon Dec 17 10:12:50 PST 2012
On Dec 17, 2012, at 8:38 AM, Borja Ferrer <borja.ferav at gmail.com> wrote:
> Hello,
>
> I'm getting the "LLVM ERROR: ran out of registers during register allocation" error message for an out of tree target I'm developing. This is happening for the following piece of C code:
>
> struct ss
> {
> int a;
> int b;
> int c;
> };
> void loop(struct ss *x, struct ss **y, int z)
> {
> int i;
> for (i=0; i<z; ++i)
> {
> x->c += y[i]->b;
> }
> }
>
> The problem relies in the register classes for the load and store with displacement instructions:
> - load DREGS:$dst, PTR:$p
> - store DREGS:$src, PTR:$p
> where DREGS is a regclass composed of 16 registers and PTR is a regclass composed of 2 registers, but the key point here is that PTR is a subset of DREGS, so cross class copies are perfectly allowed.
> One of the 2 registers in the PTR regclass is reserved for the frame pointer, leaving only one register to access both x and y[i] in the code above, which seems to confuse the regalloc. Implementing getLargestLegalSuperClass() sort of helped for simpler functions, but not for this one.
> This code can be register-allocted if the addresses of both x and y[i] are cross class copied to DREGS registers to temporarily store these values and then when required copied back to the the register in PTR to access them in memory.
>
> Any help for a solution or a workaround will be greatly appreciated since this problem is severily limiting the complexity of the programs that I can currently compile.
Those are some severe constraints on register allocation, but it ought to be possible anyway.
You may wan't to investigate how RAGreedy::canEvictInterference() is behaving.
/jakob
More information about the llvm-dev
mailing list