> Ссылка: https://blog.reverberate.org/2021/04/21/musttail-efficient-i...
> Большой разбор и в конце цитата:
> ---
> One of the biggest caveats with this approach is that these beautiful
> assembly sequences get catastrophically pessimized if any non tail calls are
> present. Any non tail call forces a stack frame to be
> created, and a lot of data spills to the stack.
> --- Вот листинг, к которому относится комментарий
ADDVN: # @ADDVN
push rbp
push r15
push r14
push r13
push r12
push rbx
push rax
mov r15, r9
mov r14, r8
mov rbx, rcx
mov r12, rsi
mov ebp, edi
movzx eax, dh
cmp dword ptr [r9 + 8*rax + 4], -12
jae .LBB0_1
.LBB0_2:
movzx eax, dl
movsd xmm0, qword ptr [r14 + 8*rax] # xmm0 = mem[0],zero
mov eax, ebp
addsd xmm0, qword ptr [r15 + 8*rax]
movsd qword ptr [r15 + 8*rax], xmm0
mov edx, dword ptr [rbx]
add rbx, 4
movzx eax, dl
movzx edi, dh
shr edx, 16
mov rax, qword ptr [r12 + 8*rax]
mov rsi, r12
mov rcx, rbx
mov r8, r14
mov r9, r15
add rsp, 8
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
jmp rax # TAILCALL
.LBB0_1:
mov edi, ebp
mov rsi, r12
mov r13d, edx
mov rcx, rbx
mov r8, r14
mov r9, r15
call fallback
mov edx, r13d
jmp .LBB0_2
"a lot of data spills to the stack" вижу (конвенция обязывает сохранить регистры из строк с rbp ... rbx; допустимо ли было это оптимизировать без inline подстановки вызываемой функции fallback или стоило перенести за метку .LBB0_1 - другой вопрос).
"a stack frame" не вижу.
RBP используется как регистр общего назначения (mov ebp, edi).
Единственная операция с указателем стека (add rsp, 8) компенсирует push rax из 8-й строки.
В связи с последним возникает вопрос: на кой пихать аккумулятор в стек, если значение не нужно?
Что-то не то с этим кодом. Возможно, недоделка оптимизатора, или баг.