https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92905
--- Comment #4 from Alexander Monakov <amonakov at gcc dot gnu.org> --- Perhaps only xmm0 is problematic, as making xmm0 unused by adding a dummy argument brings back the old spill-free result: float my_copysign(float dummy, float x, float y) { union {float f; unsigned i;} ux = {x}, uy ={y}; ux.i &= 0x7fffffff; ux.i |= 0x80000000 & uy.i; return ux.f; } float f(float dummy, float x) { union {float f; unsigned i;} u = {x}; u.i |= 0x80000000; return u.f; }