[llvm-dev] [EXT] Inline ASM Question

Bill Wendling via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 3 17:12:23 PDT 2019


Thank you! :-)

On Wed, Apr 3, 2019 at 9:10 AM Krzysztof Parzyszek <kparzysz at quicinc.com>
wrote:

> https://reviews.llvm.org/D60208
>
> --
> Krzysztof Parzyszek  kparzysz at quicinc.com   LLVM compiler development
>
> -----Original Message-----
> From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of Krzysztof
> Parzyszek via llvm-dev
> Sent: Wednesday, April 3, 2019 10:13 AM
> To: Bill Wendling <isanbard at gmail.com>; llvm-dev at lists.llvm.org
> Subject: Re: [llvm-dev] [EXT] Inline ASM Question
>
> This is a bug in X86's ISel lowering: it does not take
> "getBooleanContents" into account when extending the immediate value to 64
> bits:
>
>   case 'i': {
>     // Literal immediates are always ok.
>     if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(Op)) {
>       // Widen to 64 bits here to get it sign extended.
>       Result = DAG.getTargetConstant(CST->getSExtValue(), SDLoc(Op),
> MVT::i64);
>       break;
>     }
>
> --
> Krzysztof Parzyszek  mailto:kparzysz at quicinc.com   LLVM compiler
> development
>
> From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of Bill
> Wendling via llvm-dev
> Sent: Wednesday, April 3, 2019 1:30 AM
> To: llvm-dev <llvm-dev at lists.llvm.org>
> Subject: [EXT] [llvm-dev] Inline ASM Question
>
> The code below is triggering some weird behavior that's different from how
> gcc treats this inline asm. Clang keeps the original type of "loc" as
> "bool", which generates an "i1 true" after inlining. So far so good.
> However, during ISEL, the "true" is converted to a signed integer. So when
> it's evaluated, the result is this:
>
>     .quad       (42+(-1))-.Ltmp0
>
> (notice the "-1"). GCC emits a positive one instead:
>
>     .quad       42 + 1 - .Ltmp0
>
> I'm not sure where the problem lies. Should the inline asm promote the
> "i1" to "i32" during ISEL? Should it be promoted during inlining? Is there
> a situation where we require the value to be "i1"?
>
> -bw
>
> typedef _Bool bool;
>
> static inline
> __attribute__((__always_inline__))
> bool bar(bool loc) {
>         asm(".quad 42 + %c0 - .\n\t" : : "i" (loc));
>         return 1;
> }
>
> int foo(void) {
>         return bar(1);
> }
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190403/b381aa2f/attachment.html>


More information about the llvm-dev mailing list