[LLVMbugs] [Bug 6941] New: miscompilation - partial result optimized away

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Apr 26 08:32:41 PDT 2010


http://llvm.org/bugs/show_bug.cgi?id=6941

           Summary: miscompilation - partial result optimized away
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: FreeBSD
            Status: NEW
          Severity: normal
          Priority: P
         Component: Backend: X86
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: rdivacky at freebsd.org
                CC: llvmbugs at cs.uiuc.edu


on amd64:

pes ~$ cat buf.c
typedef unsigned int __attribute__((__mode__(__DI__))) u_int64_t;

unsigned int
snd_xbytes(unsigned int v, unsigned int from, unsigned int to)
{
 unsigned int w, x, y;

 x = from;
 y = to;

 while (y != 0) {
    w = x % y;
    x = y;
    y = w;
 }
                            // [1]
 from /= x;
 to /= x;

 // printf("v = %u, from = %u, to = %u\n", v, from, to); // [2]

 return (unsigned int)(((u_int64_t)v * to) / from);
}

int main(int argc, char **argv) {
   printf("%u\n", snd_xbytes(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])));
}


pes ~$ clang -O1 buf.c -o a.out.clang && ./a.out.clang 25050482 2094268276
1210547630

    ...warnings...

1

pes ~$ gcc -O1 buf.c -o a.out.gcc && ./a.out.gcc 25050482 2094268276 1210547630

    ...warnings...

14479903

the problem is that clang -O1 compiles the code starting at [1] to:

.LBB0_5:
        movl    %ecx, %eax
        xorl    %edx, %edx
        divl    %r8d
        movl    %edi, %ecx
        imulq   %rcx, %rax        // [3]
        movl    %esi, %eax        // [4]
        xorl    %edx, %edx
        divl    %r8d
        movl    %eax, %ecx
        xorl    %edx, %edx
        divq    %rcx
        popq    %rbp
        ret

the imulq at [3] does basically %rax = %rax * %rcx but the movl at [4] rewrites
the value in %rax which is then never used. Clang -O0 does not exhibit this 
behaviour. When I uncomment the printf at [2] the miscompilation is gone.

I guess this is backend issue as opt -O2 still shows the multiplication as live

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list