[llvm-dev] Bug or incorrect use of inline asm?

Johan Engelen via llvm-dev llvm-dev at lists.llvm.org
Fri Aug 4 02:55:21 PDT 2017


On Thu, Aug 3, 2017 at 6:19 PM, Tim Northover <t.p.northover at gmail.com>
wrote:

> 2017-08-03 8:58 GMT-07:00 Johan Engelen via llvm-dev <
> llvm-dev at lists.llvm.org>:
> > The error is gone after removing (or reducing) the alignment of `%a`.
> This
> > makes me believe that our inline asm syntax is correct to add an offset
> to a
> > pointer: " 4+$0 ".
>
> The AT&T syntax for a displaced address doesn't have the '+'; it's
> just "4(%rsp)" so you should change the IR to "4$0".
>
> LLVM appears to be optimizing the addressing mode, and the optimizer
> is being more lenient on this detail so you're getting lucky when the
> +4 can be combined with an existing %rsp offset.


Things break down when part of the offset is a linktime constant:

```
source_filename = "asanasm.d"
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"

@globVar = global [2 x i32] [i32 66051, i32 66051]

define void @_D7asanasm8offconstFZv() {
  call void asm sideeffect "movdqa 4$0, %xmm7", "*m,~{xmm7}"([2 x i32]*
@globVar)
  ret void
}
```

results in:
<inline asm>:1:10: error: unexpected token in argument list
        movdqa 4globVar(%rip), %xmm7

So in that case, I do have to add the '+' to make it work ("4+$0").

So depending on the pointer argument, I need to write a + or without +,
complicating automatic codegen.

Thanks for the help,
  Johan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170804/e12f9727/attachment-0001.html>


More information about the llvm-dev mailing list