[Bug target/90360] New: Missed optimization: unnecessary use of callee-saved registers
coypu at sdf dot org
gcc-bugzilla@gcc.gnu.org
Mon May 6 11:04:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90360
Bug ID: 90360
Summary: Missed optimization: unnecessary use of callee-saved
registers
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: coypu at sdf dot org
Target Milestone: ---
if I compile this code with -O3
typedef struct once_t {
int val;
int pto_done;
} once_t;
int
once_stub(once_t *o, void (*r)(void))
{
if (o->pto_done == 0) {
(*r)();
o->pto_done = 1;
}
return (0);
}
The output is:
once_stub(once_t*, void (*)()):
movl 4(%rdi), %eax
testl %eax, %eax
jne .L4
pushq %rbx
movq %rdi, %rbx
call *%rsi
movl $1, 4(%rbx)
xorl %eax, %eax
popq %rbx
ret
.L4:
xorl %eax, %eax
ret
I think push/pop instructions won't be necessary if
another register besides rbx is picked.
More information about the Gcc-bugs
mailing list