https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80237
Bug ID: 80237
Summary: float to double conversion is not optimized away
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: nsz at gcc dot gnu.org
Target Milestone: ---
i get suboptimal code for
__attribute__((noinline))
static float f(float x)
{
return x*x;
}
static double g(float x)
{
return x>0 ? f(x) : x+1.0;
}
float foo(float x)
{
return g(x);
}
i expected a tail call because for float x, (float)(double)x conversion is a
nop, but with -O3 i get
f:
mulss %xmm0, %xmm0
ret
foo:
ucomiss .LC0(%rip), %xmm0
jbe .L8
call f ///////////////// why not tail call?
cvtss2sd %xmm0, %xmm0
cvtsd2ss %xmm0, %xmm0
ret
.L8:
cvtss2sd %xmm0, %xmm0
addsd .LC1(%rip), %xmm0
cvtsd2ss %xmm0, %xmm0
ret
.LC0:
.long 0
.LC1:
.long 0
.long 1072693248