https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61423

            Bug ID: 61423
           Summary: Incorrect conversion from unsigned int to floating
                    point
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lvqcl.mail at gmail dot com

The attached program works incorrectly when compiled for i686 with '-O3 -msse2'
or '-O1 -ftree-vectorize -msse2'.

GCC compiles the function

#define N 1024
static unsigned int A[N];
double func (void)
{
    unsigned int sum = 0;
    unsigned i;
    double t;

    for (i = 0; i < N; i++) sum += A[i];

    t = sum; /* uint32 -> double */
    return t;
}

into the following:

01:    pxor    %xmm0, %xmm0
02:    movl    $_A, %eax
03: L2:
04:    paddd    (%eax), %xmm0
05:    addl    $16, %eax
06:    cmpl    $_A+4096, %eax
07:    jne    L2
08:    movdqa    %xmm0, %xmm1
09:    subl    $28, %esp
10:    psrldq    $8, %xmm1
11:    paddd    %xmm1, %xmm0
12:    movdqa    %xmm0, %xmm1
13:    psrldq    $4, %xmm1
14:    paddd    %xmm1, %xmm0
15:    movq    %xmm0, 8(%esp)
16:    fildq    8(%esp)
17:    addl    $28, %esp
18:    ret

After the line 07: xmm0 contains four partial sums.
After the line 14: lower 4 bytes of xmm0 contain the total sum, the rest 12
bytes contain garbage.
Lines 15 and 16: *eight* bytes from xmm0 are stored in memory and then loaded
into an FPU register.

According to the message from Robert Kausch (
http://lists.xiph.org/pipermail/flac-dev/2014-June/004723.html ) this bug
exists since GCC 4.4.

Reply via email to