[LLVMdev] Spilling multi-word virtual registers

Ken Dyck
2010-07-21T14:44:37Z

On Tuesday, July 20, 2010 4:04 PM, Jakob Stoklund Olesen
>
> On Jul 20, 2010, at 10:57 AM, Ken Dyck wrote:
>
> > Does anybody have any tips for generating spills/reloads for large
> > non-vector registers?
> > [snip]
>
>
> This is quite simple to handle. A register
> MachineOperand has a subreg field for this
> purpose. It is used to pick out subregisters
> of a virtual register.

Thanks, Jakob. That indeed was a simple fix.

> The register allocator (rewriter to be exact)
> will clear the subreg field when substituting
> the allocated physical register.

Speaking of the rewriter, I've had some problems recently where the
rewriter replaces the last of the three load instructions with a COPY
instruction because isLoadFromStackSlot() returns the same frame index
for all three load. For example,

  load a.l, <fi#n>, 0        load a.l, <fi#n>, 0
  load a.h  <fi#n>, 1  ===>  load a.h, <fi#n>, 1
  load a.e  <fi#n>, 3        move a.e, a.l

I quickly hacked around the problem by returning a frame index only for
the loads of the low sub-register (returning 0 for the rest), but I'm
sure this isn't the best solution. Is there a simple way to avoid the
replacement while still reporting the actual frame index for all of the
load instructions?

-Ken