https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105513
Bug ID: 105513 Summary: [9/10/11/12/13 Regression] Unnecessary SSE spill Product: gcc Version: unknown Status: UNCONFIRMED Keywords: missed-optimization, ra Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: amonakov at gcc dot gnu.org Target Milestone: --- Target: x86_64-*-* i?86-*-* Minimized from PR 105504. Compile with -O2 -mtune=haswell -mavx (other -mtune variants are affected too): static int as_int(float x) { return (union{float x; int i;}){x}.i; } float f(double y, float x) { int i = as_int(x); if (__builtin_expect(i > 99, 0)) return 0; if (i*2u < 77) if (i==2) return 0; return y*x; } GCC moves 'x' to 'i' via stack and then reloads from stack again when computing 'y*x': f: vmovss DWORD PTR [rsp-4], xmm1 mov eax, DWORD PTR [rsp-4] cmp eax, 99 jg .L5 lea edx, [rax+rax] cmp edx, 76 ja .L6 cmp eax, 2 je .L5 .L6: vcvtss2sd xmm1, xmm1, DWORD PTR [rsp-4] vmulsd xmm0, xmm1, xmm0 vcvtsd2ss xmm0, xmm0, xmm0 ret .L5: vxorps xmm0, xmm0, xmm0 ret This is a regression relative to gcc-8. Interestingly, flipping '0' to '1' in __builtin_expect (i.e. making early exit likely) results in good code, so perhaps RA costing takes block probabilities backwards somewhere?