https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120590
Bug ID: 120590
Summary: caller-saved register isn't preserved across a call
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Keywords: ra
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: hjl.tools at gmail dot com
CC: liuhongt at gcc dot gnu.org
Target Milestone: ---
[hjl@gnu-tgl-3 tmp]$ cat y.c
#include <x86intrin.h>
extern int func (void);
extern int i;
__m128i
foo (void)
{
register __m128i xmm7 __asm ("xmm7") = _mm_set1_epi64x (3);
asm volatile ("" : "+v" (xmm7));
i = func ();
return xmm7;
}
[hjl@gnu-tgl-3 tmp]$ gcc -S -O2 y.c
[hjl@gnu-tgl-3 tmp]$ cat y.s
.file "y.c"
.text
.p2align 4
.globl foo
.type foo, @function
foo:
.LFB7470:
.cfi_startproc
movl $3, %eax
subq $8, %rsp
.cfi_def_cfa_offset 16
movq %rax, %xmm7
punpcklqdq %xmm7, %xmm7
call func
movl %eax, i(%rip)
movdqa %xmm7, %xmm0
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE7470:
.size foo, .-foo
.ident "GCC: (GNU) 15.1.1 20250521 (Red Hat 15.1.1-2)"
.section .note.GNU-stack,"",@progbits
[hjl@gnu-tgl-3 tmp]$
Since XMM7 is caller-saved, func may clobber it. But XMM7 isn't preserved.