[Bug tree-optimization/26144] with -O3 and pointer casts, gcc skips if
devin at freeshell dot org
gcc-bugzilla@gcc.gnu.org
Tue Feb 7 17:07:00 GMT 2006
------- Comment #2 from devin at freeshell dot org 2006-02-07 17:07 -------
I could reproduce it with that dated build. And it isn't just debian but also
the buildroot gcc. Here is the assembly produced from -O3. Following that is
the assembly from -O2. What seems to happen is that with -O3 foo() is
optimized out and in it's place .LC0 is stored on the stack. Seems fine. But
then the original value of "ptr" is used for calling printf instead of the
updated value from the stack.
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string ""
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl $.LC0, (%eax)
popl %ebp
ret
.size foo, .-foo
.section .rodata.str1.1
.LC1:
.string "%p"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 12(%ebp), %eax
andl $-16, %esp
subl $16, %esp
movl 4(%eax), %eax
testl %eax, %eax
movl %eax, -4(%ebp)
je .L8
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call printf
xorl %eax, %eax
leave
ret
.p2align 4,,7
.L8:
movl $.LC0, -4(%ebp)
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call printf
xorl %eax, %eax
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.0.3 20060128 (prerelease) (Debian 4.0.2-8)"
.section .note.GNU-stack,"",@progbits
############## Correct Version #########################
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string ""
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl $.LC0, (%eax)
popl %ebp
ret
.size foo, .-foo
.section .rodata.str1.1
.LC1:
.string "%p"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 12(%ebp), %eax
andl $-16, %esp
subl $16, %esp
movl 4(%eax), %eax
testl %eax, %eax
movl %eax, -4(%ebp)
je .L8
movl -4(%ebp), %eax
movl $.LC1, (%esp)
movl %eax, 4(%esp)
call printf
xorl %eax, %eax
leave
ret
.p2align 4,,7
.L8:
leal -4(%ebp), %eax
movl %eax, (%esp)
call foo
movl -4(%ebp), %eax
movl $.LC1, (%esp)
movl %eax, 4(%esp)
call printf
xorl %eax, %eax
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.0.3 20060128 (prerelease) (Debian 4.0.2-8)"
.section .note.GNU-stack,"",@progbits
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26144
More information about the Gcc-bugs
mailing list