[LLVMdev] Named Register Implementation

Renato Golin renato.golin at linaro.org
Sun Mar 30 11:34:25 PDT 2014


On 29 March 2014 22:25, Evan Cheng <evan.cheng at apple.com> wrote:
>> 1. Implement named registers for non-allocatable registers
>
> I'm not sure if this would work even for non-allocatable registers. I fear this may codegen to a copy from the register and subsequent reads are all of the gpr.

Hi Evan,

I'm not sure I follow what GPRs.

The plan is to transform all reads from a variable marked "register
long foo asm("reg")" into an intrinsic "@llvm.read_register("reg")".
If we also want the builtin, that's as easy as mapping
"__builtin_stack_pointer()" to "@llvm.read_register("SP")", so the
underlying implementation is the same.

So:

register unsigned long foo asm("SP"); // does nothing
long a = foo; // %a = call i32 @llvm.read_register("SP") ->
DAG.CopyFromReg("SP")
long b = a;   // %0 = load %a, store %0, %b (in GPRs, since both a and
b are C variables)
long c = foo; // %c = call i32 @llvm.read_register("SP") ->
DAG.CopyFromReg("SP")

In any case, "foo" doesn't exist as a variable in the C level
representation (no alloca, etc), and since we can't take the address
of it (due to C restrictions), that's fine. If you transfer the values
to other variables, in GPRs or in the stack/memory, than all bets are
off, and I believe that this is the same in GCC, but *all*
reads/writes to named register variables should be represented by
read/write intrinsics.

cheers,
--renato



More information about the llvm-dev mailing list