[LLVMdev] Explicit register usage in LLVM assembly

Yiannis Tsiouris yiannis.tsiouris at gmail.com
Fri Jul 8 12:10:01 PDT 2011


On Sun, Apr 3, 2011 at 2:58 AM, David Terei <davidterei at gmail.com> wrote:

> Hi Yiannis,
>
> As has been said GHC had this problem (I'm the author of GHC's LLVM
> backend). GHC uses 4 pinned registers on x86-32 and 16 on x86-64. The
> solution is to use a custom calling convention. I would argue that
> this is a better solution then having the registers completely
> reserved as in the middle of a function llvm can spill those registers
> to free them up for temporary use. Also, if when generating code you
> know that one of the pinned registers doesn't actually store anything
> useful for this function then you can avoid passing it on to the next
> function so that the register will be free to use during the function.
>
> Here is a link to the original discussion about this problem and the
> solution:
>
> http://nondot.org/sabre/LLVMNotes/GlobalRegisterVariables.txt
>
> You should also check out the GHC calling convention as there is a
> good chance you could use it to get what you want and not have to
> modify llvm at all. The calling conventions for X86 are defined in
> 'lib/Target/X86/X86CallingConv.td' in a very easy to read format.
>
> On X86-64 the arguments are passed in R13, RBP, R12, RBX, R14, RSI,
> RDI, R8, R9, R15, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, in that order.
>
> So lets say the compiler you are trying to work with currently stores
> a Sp and a Hp in %R13 and %R12 respectively. You could define your
> functions like so:
>
> function cc 10 void f (Sp, tmp1, Hp) {
>  [...]
>  tail call g (Sp', undef, Hp');
>  ret void;
> }
>
> Cheers,
> David
>
> Hey people,

It has been some time since the last email on this topic. Since then i have
successfully used your advice and implemented a custom calling convention
for my backend that adheres to the runtime system's ABI. To summarize what i
do: i have three virtual registers (HP, P, NSP) pinned to some physical
registers by defining it in the custom calling convention. I have also
defined a custom return cc in order to guarantee that the physical registers
also have the correct values on exit of the function. In that way i am sure
that the registers are updated both on entrance and exit and that is exactly
what i want.

The problem with that is the case of an 'invoke' call. According to the
semantics of the invoke instruction the return value is not available  when
a stack unwind happens. From the Language Reference Manual:
 "For the purposes of the SSA form, the definition of the value returned by
the 'invoke' instruction is deemed to occur on the edge from the current
block to the "normal" label. If the callee unwinds then no return value is
available."

In that case, how can i get the values of the pinned registers, i.e. HP, P
and NSP, needed in the Fail code block?


Cheers,
Yiannis
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110708/06edb62c/attachment.html>


More information about the llvm-dev mailing list