[LLVMdev] Miscompilation on MingW32
Julien Lerouge
jlerouge at apple.com
Wed Jun 11 11:39:07 PDT 2008
Hello,
I have this simple IR:
------------------------------------------------------------------------
define internal i32 @tmp(i32 %x) {
entry:
br label %entry2
entry2:
%x1 = alloca i32
%x2 = alloca i32
%retval = alloca i32
%dummy = alloca i32
store i32 %x, i32* %x1
store i32 %x, i32* %x2
%tmp1 = load i32* %x1
%tmp2 = add i32 %tmp1, %tmp1
%tmp3 = add i32 %tmp2, %tmp2
store i32 %tmp3, i32* %retval
br label %return
return:
%rc = load i32* %retval
ret i32 %rc
}
define i32 @main() nounwind {
entry:
%tmp = call i32 @tmp(i32 1) nounwind
ret i32 %tmp
}
------------------------------------------------------------------------
I am expecting the main function to return 4 (works fine on MacOS).
On MingW (i386-pc-mingw32), using the current SVN and lli or llc, it
returns a random value. The assembly below is the output of llc for that
target. I can clearly see the 4 allocas, x1 is at %edi, x2 is at %ebx,
%retval on the stack at -16(%ebp) and %dummy, which is unused is at %esp
%after the last alloca.
The first movl after the two addl is using a wrong address to store the
result (%esp points to %dummy, but the result should not be stored
there).
------------------------------------------------------------------------
.text
.align 16
.def _tmp; .scl 3; .type 32; .endef
_tmp:
pushl %ebp
Llabel1:
movl %esp, %ebp
Llabel2:
pushl %ebx
pushl %edi
pushl %esi
subl $4, %esp
LBB1_1: # entry2
movl $8, %esi
movl %esi, %eax
call __alloca
movl %esp, %edi
movl %esi, %eax
call __alloca
movl %esp, %ebx
movl %esi, %eax
call __alloca
movl %esp, -16(%ebp)
movl %esi, %eax
call __alloca
movl 8(%ebp), %eax
movl %eax, (%edi)
movl %eax, (%ebx)
movl (%edi), %eax
addl %eax, %eax
addl %eax, %eax
movl %eax, (%esp) <=== should be 8(%esp) or -40(%ebp) ?
LBB1_2: # return
movl -16(%ebp), %eax
movl (%eax), %eax
leal -12(%ebp), %esp
popl %esi
popl %edi
popl %ebx
popl %ebp
ret
.align 16
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call ___main
movl $1, (%esp)
call _tmp
addl $8, %esp
popl %ebp
ret
------------------------------------------------------------------------
Any idea why this is happening ?
Thanks,
Julien
--
Julien Lerouge
PGP Key Id: 0xB1964A62
PGP Fingerprint: 392D 4BAD DB8B CE7F 4E5F FA3C 62DB 4AA7 B196 4A62
PGP Public Key from: keyserver.pgp.com
More information about the llvm-dev
mailing list