Usaré el siguiente código C para explicar mi pregunta:
#include <stdio.h>
int main(void) {
printf("foo\n");
return 0;
}
Antes de GCC 4.9.0, desmontarlo produce:
.LC0:
.string "foo"
main:
push ebp
mov ebp, esp
and esp, -16
sub esp, 16
mov DWORD PTR [esp], OFFSET FLAT:.LC0
call puts
mov eax, 0
leave
ret
Sin embargo, desde GHC 4.9.0, el resultado es como:
.LC0:
.string "foo"
main:
lea ecx, [esp+4]
and esp, -16
push DWORD PTR [ecx-4]
push ebp
mov ebp, esp
push ecx
sub esp, 4
sub esp, 12
push OFFSET FLAT:.LC0
call puts
add esp, 16
mov eax, 0
mov ecx, DWORD PTR [ebp-4]
leave
lea esp, [ecx-4]
ret
¿Alguien sabe por qué se toma esta modificación?