Mam kompilacji program C i porównując wygenerowany kod montaż:Dlaczego LLVM dodaje dwie dodatkowe instrukcje dla tego samego programu?
int main(){ return 0; }
GCC daje tej funkcji main (cc hello.c -S
):
_main:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $0, %eax
leave
ret
LLVM daje tej funkcji main (clang hello.c -S
):
_main:
Leh_func_begin0:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
popq %rbp
ret
Leh_func_end0:
Do czego potrzebne są movl $0, -4(%rbp)
i popq %rbp
? Przeniesienie czegoś na stos i wyrzucenie go bezpośrednio potem wydaje mi się bezużyteczne.
Wydaje się nieco niesprawiedliwe porównanie wydajności montażu kompilatorów bez korzystania z optymalizatora. –