I don't think this is valid. You cannot depend on where the spill will
happen around a function call. It is spilling to save the volatile
register. With -O, we don't use volatile registers to keep variables
across functions. While at -O2 we do so it saves it right before the
function call.
Sent from my iPhone
On May 29, 2010, at 8:25 AM, "hjl dot tools at gmail dot com" <gcc-bugzi...@gcc.gnu.org
> wrote:
On Linux/x86-64, IRA/reload moves asm statement by
adding "movss" at -O2:
[...@gnu-6 vzeroupper-1]$ cat foo.c
extern void bar2 (void);
float
foo (float y)
{
asm volatile ("nop");
bar2 ();
return y;
}
[...@gnu-6 vzeroupper-1]$ gcc -S -O foo.c
[...@gnu-6 vzeroupper-1]$ cat foo.s
.file "foo.c"
.text
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
movss %xmm0, 12(%rsp)
#APP
# 5 "foo.c" 1
nop
# 0 "" 2
#NO_APP
call bar2
movss 12(%rsp), %xmm0
addq $24, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (GNU) 4.4.3 20100127 (Red Hat 4.4.3-4)"
.section .note.GNU-stack,"",@progbits
[...@gnu-6 vzeroupper-1]$ gcc -S -O2 foo.c
[...@gnu-6 vzeroupper-1]$ cat foo.s
.file "foo.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
#APP
# 5 "foo.c" 1
nop
# 0 "" 2
#NO_APP
movss %xmm0, (%rsp)
call bar2
movss (%rsp), %xmm0
addq $24, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (GNU) 4.4.3 20100127 (Red Hat 4.4.3-4)"
.section .note.GNU-stack,"",@progbits
[...@gnu-6 vzeroupper-1]$
--
Summary: IRA/reload moves asm statement
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: hjl dot tools at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44323