Почему gcc создает избыточный код сборки?

Я хотел посмотреть, как определенные функции C/C++ были преобразованы в ассемблер, и я создал следующий файл:

struct foo {
    int x;
    char y[0];
};

char *bar(struct foo *f)
{
    return f->y;
}

Затем я скомпилировал его с помощью gcc -S(а также попробовал с g++ -S), но когда я посмотрел на ассемблерный код, я был разочарован, обнаружив тривиальную избыточность в функции bar, которую, как я думал, gccможно оптимизировать:

_bar:
Leh_func_begin1:
        pushq   %rbp
Ltmp0:
        movq    %rsp, %rbp
Ltmp1:
        movq    %rdi, -8(%rbp)
        movq    -8(%rbp), %rax
        movabsq $4, %rcx
        addq    %rcx, %rax
        movq    %rax, -24(%rbp)
        movq    -24(%rbp), %rax
        movq    %rax, -16(%rbp)
        movq    -16(%rbp), %rax
        popq    %rbp
        ret
Leh_func_end1:

Среди прочего вещи, строки

        movq    %rax, -24(%rbp)
        movq    -24(%rbp), %rax
        movq    %rax, -16(%rbp)
        movq    -16(%rbp), %rax

кажутся бессмысленно излишними. Есть ли какая-то причина, по которой gcc (и, возможно, другие компиляторы) не может/не оптимизирует это?

5
задан Matt 19 May 2012 в 06:45
поделиться