[llvm-bugs] [Bug 51340] New: Wrong code generated for x86 inline assembly

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Aug 4 05:22:25 PDT 2021


https://bugs.llvm.org/show_bug.cgi?id=51340

            Bug ID: 51340
           Summary: Wrong code generated for x86 inline assembly
           Product: clang
           Version: 12.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C
          Assignee: unassignedclangbugs at nondot.org
          Reporter: pgofman at codeweavers.com
                CC: blitzrakete at gmail.com, dgregor at apple.com,
                    erik.pilkington at gmail.com, llvm-bugs at lists.llvm.org,
                    richard-llvm at metafoo.co.uk

Created attachment 25105
  --> https://bugs.llvm.org/attachment.cgi?id=25105&action=edit
Isolated test case

The bug affects wine-mono project (compiling WPF code with clang).

I am attaching an isolated test case which reproduces the issue which isolates
the miscompiled code.

When compiled with 'clang -fms-extensions -m32 ./clang_bug.c' wrongly
translates 'movss    fi.f,xmm1;'  instruction. Instead of referencing the
address on stack it uses eax as destination address where the compiler has
stored the stack address before the asm block. The eax has been overwritten by
prior instructions in the assembly. 'movss    fi.f,xmm1;' is also translated
wrong using 'ecx' where the compiler has also stored the same stack address of
'fi' variable.

The issue is not reproducible if not using union here (e. g., just defining
'fi' as float or int). It is also not reproducible when adding '-O2' to
compiler flags.

Here is the relevant asm compilation result for the wrong case:

round_func:                             # @round_func
        .cfi_startproc
# %bb.0:
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset %ebp, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register %ebp
        subl    $8, %esp
        movss   8(%ebp), %xmm0                  # xmm0 = mem[0],zero,zero,zero
        leal    -8(%ebp), %eax
        leal    -8(%ebp), %ecx
        #APP

        movss   8(%ebp), %xmm0                  # xmm0 = mem[0],zero,zero,zero
        cvtss2si        %xmm0, %eax
        cvtsi2ss        %eax, %xmm1
        subss   %xmm0, %xmm1
        movss   round_func.negHalf, %xmm0       # xmm0 = mem[0],zero,zero,zero
        cmpless %xmm0, %xmm1
        movss   %xmm1, (%eax)
        subl    (%ecx), %eax

        #NO_APP
        addl    $8, %esp
        popl    %ebp
        .cfi_def_cfa %esp, 4
        retl
.Lfunc_end0:
        .size   round_func, .Lfunc_end0-round_func
        .cfi_endproc

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20210804/53c09efb/attachment.html>


More information about the llvm-bugs mailing list