https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85957
--- Comment #19 from Rich Felker <bugdal at aerifal dot cx> --- Test case provided by Szabolcs Nagy showing that GCC does seem to spill right if it can't assume there's no excess precision to begin with: double h(); double ff(double x, double y) { return x+y+h(); } In theory this doesn't force a spill, but GCC seems to choose to do one, I guess to avoid having to preserve two incoming values (although they're already in stack slots that would be naturally preserved). Here GCC 9.2 with -fexcess-precision=standard -O3 it emits fstpt/fldt.