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