0%

Optimizing C++ Code : Constant-Folding in Different Compilers

看了VC Blog的Constant-Folding之後,測試一下VC2012,GCC和Clang對最佳化的演繹程度為何。
比較基準,未開最佳化(VC是/Od,而GCC/Clang是-O0),跟第二級最佳化(/O2和-O2)
第一個範例

1
int main() { return 7 + 8; }

不果是VC2012,GCC或是Clang都會直接將eax填入15,無論有沒有開最佳化。這邊的最佳化不需要後端Codegen的幫忙。
第二個範例

1
2
int bump(int n) { return n + 1; }
int main() { return 3 + bump(6); }

在未開最佳化的情況,VC產生的Assembly Code像這樣

1
2
3
mov     ecx, 6
call ?bump@@YAHH@Z
add eax, 3

而最佳化的Assembly Code則是

1
mov     eax, 10

這邊需要後端Codegen的幫忙,才能在編譯的時刻得到常數值。
而GCC跟Clang的表現也差不多,最大的差別是Intel語法跟AT&T對組合語言的表示方式不同。
未最佳化版本

1
2
3
movl	$6, %edi
call _Z4bumpi
addl $3, %eax

最佳化版本

1
movl	$10, %eax

在這種最簡單的最佳化大家都有一樣的能力,接著可以看其他部分的差異。