[LLVMdev] Spilling multi-word virtual registers

Ken Dyck
Tue, 27 Jul 2010 11:48:09 -0000

On Wednesday, July 21, 2010 11:21 AM, Jakob Stoklund Olesen
wrote:
>
> On Jul 21, 2010, at 7:44 AM, Ken Dyck wrote:
> > 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?
>
> Yeah, the target hooks are not really
> prepared for dealing with subregisters, and
> the rewriter doesn't really expect multiple
> instructions to be inserted by the hooks.
>
> To be safe, you should probably only return
> true from isLoadFromStackSlot when the
> instruction loads the whole stack slot. That
> is, the offset is zero, and the stack slot
> size matches the register size.

This seems to result in dead frame indices being passed to
eliminateFrameIndex(). I'm currently handling these by removing the
load/store instructions in which they appear. I haven't found any errors
in the code that gets generated so far, but I also notice that none of
the other back ends seem to have any special logic to handle dead slots
in eliminateFrameIndex(). Should I be concerned?

-Ken