特定の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(およびおそらく他のコンパイラ)がこれを最適化できない/しない理由はありますか?