[LLVMdev] [PATCH] RegScavenger::scavengeRegister

Akira Hatanaka ahatanak at gmail.com
Tue Mar 26 10:29:02 PDT 2013


On Mon, Mar 25, 2013 at 4:02 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk>wrote:

>
> On Mar 25, 2013, at 2:51 PM, Akira Hatanaka <ahatanak at gmail.com> wrote:
>
> > Yes, it sounds like it will solve the problem.
> >
> > Using the following example where live ranges of accumulators $vreg_acc0
> and $vreg_acc1 conflict,
> >
> > MULT $vreg_acc0, $vreg_gpr0, $vreg_gpr1
> > MULT $vreg_acc1, $vreg_gpr2, $vreg_gpr3
> >
> > (consumer of $vreg_acc1)
> > (consumer of $vreg_acc0)
> >
> > if the register can create new virtual registers $vreg_gpr4 and
> $vreg_gpr5, I think spilling can be avoided:
> >
> >
> > MULT $vreg_acc0, $vreg_gpr0, $vreg_gpr1
> > copy $vreg_gpr4, $vreg_acc0:lo // spill lo
> > copy $vreg_gpr5, $vreg_acc0:hi // spill hi
> > MULT $vreg_acc1, $vreg_gpr2, $vreg_gpr3
> >
> > (consumer of $vreg_acc1)
> > copy $vreg_acc0:lo, $vreg_gpr4 // restore lo
> > copy $vreg_acc0:hi, $vreg_gpr5 // restore hi
> > (consumer of $vreg_acc0)
>
> The cross class spilling doesn't support spilling to multiple registers,
> though. I thought you could copy the accumulator to a single 64-bit
> register.
>
>
The size of general purpose integer registers for mips32 is 32-bit and
accumulators are 64-bit registers consisting of 32-bit hi/lo register
pairs. So you will need two instructions to copy two 32-bit GPR registers
to a 64-bit accumulator register. If spilling to multiple registers is
unsupported, perhaps I can I define a new register class consisting of
paired GPR registers and pseudo copy instructions?

> Also, should RA avoid splitting live intervals of accumulators, which
> creates copy instructions?
>
> The alternative to live range splitting is spilling, which is usually
> worse.
>
>
Here I was assuming register allocator will spill accumulator registers to
integer registers instead of directly to stack. In that case, splitting
might be worse than spilling since reload requires two GPR-to-accumulator
copy instructions while copying one accumulator to another requires four
copy instructions (instruction set doesn't have any
accumulator-to-accumulator copy instructions):

copy $vreg_gpr0, $vreg_acc0:lo
copy $vreg_gpr1, $vreg_acc0:hi
copy $vreg_acc1:lo, $vreg_gpr0
copy $vreg_acc1:hi, $vreg_gpr1



> /jakob
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130326/0470e54d/attachment.html>


More information about the llvm-dev mailing list