[llvm-dev] Issue with inline assembly, function inlining, and position independent code

Dominic Chen via llvm-dev llvm-dev at lists.llvm.org
Fri Jul 31 00:42:37 PDT 2020


Thanks, I completely forgot about just changing the constraint.
Originally, I thought there are probably cases of integer-to-pointer
conversion, so it'd be ideal to allow encoding an integer directly as an
immediate. But this might be pretty rare in practice, so the trade-off
is probably worth it. I'll retest on the SPEC2006/2017 benchmark suites
and get back to you.

Dominic

On 7/31/2020 2:53 AM, Craig Topper wrote:
> Trying to look at your example. Why is the constraint on the pointer
> variable to the inline assembly "ri" instead of just "r". Changing it
> to "r" seems to compile.
>
> ~Craig
>
>
> On Thu, Jul 30, 2020 at 10:59 PM Dominic Chen via llvm-dev
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>     Code: https://godbolt.org/z/T397fo
>
>     I'm running some performance experiments on a x86-64 linux system,
>     where I've modified LLVM to reserve a register, and I'd like to
>     use that register in my code. Currently, I'm using %r12d, which is
>     callee save, so I don't need to worry about compatibility with
>     existing libraries or system calls. For security reasons, the
>     generated binaries need to be position independent.
>
>     To access the register, I need to use inline assembly; either for
>     all dependent computations, or just for moving the register value
>     into a C++ variable. Since the latter results in a second register
>     allocation, I'm just doing assembly for everything. So, I have a
>     function `foo` that contains some inline assembly.
>
>     The problem is that its input arguments can sometimes be pointers
>     to constant data, and after function inlining, the result may no
>     longer link because R_X86_64_32S relocations are not permitted. I
>     need to get LLVM to introduce a load-effective address (`lea`) to
>     move the pointer into a register, if applicable, but I haven't
>     found a method that both works and is performant. I could modify
>     LLVM locally to make this happen, but this seems pretty deep in
>     the X86 backend and not straightforward?
>
>      1. Make the input argument `volatile` or introduce a `volatile`
>         variable. Works, but adds two moves to and from the stack.
>      2. Introduce a `register` variable equal to the input argument.
>         Results in an error with C++17, and doesn't seem to work
>         otherwise.
>      3. Only use inline assembly to move %r12d into a C variable.
>         Mostly works, but the variable isn't incremented afterwards,
>         requires an extra register, and adds multiple extra moves.
>      4. Use the local register variable extension to force a C
>         variable to %r12d. Not supported by Clang/LLVM.
>
>     Thanks,
>
>     Dominic
>
>     _______________________________________________
>     LLVM Developers mailing list
>     llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>     https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>


More information about the llvm-dev mailing list