https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107772
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So for aarch64, this is fully fixed. For x86_64, it was improved in GCC 15 to produce: ``` f(int*, int*): cmp rdi, rsi je .L10 push rbx mov rbx, rdi sub rsp, 16 .L4: mov edi, DWORD PTR [rbx] test edi, edi jne .L14 .L3: add rbx, 4 cmp rsi, rbx jne .L4 add rsp, 16 pop rbx ret .L14: mov QWORD PTR [rsp+8], rsi call g(int) mov rsi, QWORD PTR [rsp+8] mov DWORD PTR [rbx], eax jmp .L3 .L10: ret ``` Notice only save/restoring of rsi around the call but rbx is still pushed on the stack. Looks like the rest of the bb from L3 is not copied into L14 unlike what is done aarch64. I don't know why though.