https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114487
--- Comment #2 from Uroš Bizjak <ubizjak at gmail dot com> --- (In reply to Richard Biener from comment #1) > (insn 6 5 0 (set (reg/v:SF 99 [ gamma ]) > (reg:SF 20 xmm0)) "testautomation-testautomation_pixels.i":15:17 -1 > (nil)) > > I'm not sure what's wrong - looks like a target issue to me. We are working with SFmode, so -msse is enough to trigger the bug. This is known issue. GCC assumes that at least moves of all hard registers are working, which is not the case when LTO-compiling testautomation-testautomation_pixels.i with SDL_test_fuzzer.o (that enables and uses XMM registers via -msse -mfpmath=sse). It looks to me that the compiler hits this part in function_value_32 when LTO-compiling: --cut here-- /* Override FP return register with %xmm0 for local functions when SSE math is enabled or for functions with sseregparm attribute. */ if ((fn || fntype) && (mode == SFmode || mode == DFmode)) { int sse_level = ix86_function_sseregparm (fntype, fn, false); if (sse_level == -1) { error ("calling %qD with SSE calling convention without " "SSE/SSE2 enabled", fn); sorry ("this is a GCC bug that can be worked around by adding " "attribute used to function called"); } else if ((sse_level >= 1 && mode == SFmode) || (sse_level == 2 && mode == DFmode)) regno = FIRST_SSE_REG; } --cut here-- Adding -msse to the second compilation works OK, removing -mfpmath=sse from the first compilation also works OK.