GCCの最適化オプションは "-O3"までしかない
ここ十数年ぐらいの GCCの最適化は "-O3"までありません。
稀に "-O3"より大きい、"-O4"等を見るけど、それは結局 "-O3"に
されてしまいます。
追記
なお最高速度のオプションは "-Ofast"です。ただこれは規約に
沿わない形での最適化も含まれます。大部分は問題無いと思い
ますが、利用する場合は一応注意した方がよいでしょう。
GCC 4.8 snapshotのソースコードで確認したところ、一応内部的には保持
されていますが、結局最大で 3との比較しかないので意味がありません。
(255以上だと 255以上にされます)
大昔は "-O6"まであったという話ですが、今はありません。
将来的にどうなるか知りませんが、意図しないことをされないように
"-O3"までをつけるのが無難でしょう。
各オプションの違いを知る。
GCCの各オプティマイズレベルで有効になる最適化を調べる - Life is very short
最適化オプションと"--help=optimizers"でどのオプションが有効に
なるか確認できますので、それの差分を取ればよいでしょう。
% gcc --version gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % gcc -Q -O2 --help=optimizers > O2.list % gcc -Q -O3 --help=optimizers > O3.list % diff -u O2.list O3.list --- O2.list 2012-12-11 21:14:46.475241940 +0900 +++ O3.list 2012-12-11 21:14:50.627241794 +0900 @@ -36,7 +36,7 @@ -ffloat-store [無効] -fforward-propagate [有効] -fgcse [有効] - -fgcse-after-reload [無効] + -fgcse-after-reload [有効] -fgcse-las [無効] -fgcse-lm [有効] -fgcse-sm [無効] @@ -46,11 +46,11 @@ -fif-conversion [有効] -fif-conversion2 [有効] -finline-atomics [有効] - -finline-functions [無効] + -finline-functions [有効] -finline-functions-called-once [有効] -finline-small-functions [有効] -fipa-cp [有効] - -fipa-cp-clone [無効] + -fipa-cp-clone [有効] -fipa-matrix-reorg [無効] -fipa-profile [有効] -fipa-pta [無効] @@ -80,7 +80,7 @@ -fpeel-loops [無効] -fpeephole [有効] -fpeephole2 [有効] - -fpredictive-commoning [無効] + -fpredictive-commoning [有効] -fprefetch-loop-arrays [有効] -freg-struct-return [無効] -fregmove [有効] @@ -142,7 +142,7 @@ -ftree-dse [有効] -ftree-forwprop [有効] -ftree-fre [有効] - -ftree-loop-distribute-patterns [無効] + -ftree-loop-distribute-patterns [有効] -ftree-loop-distribution [無効] -ftree-loop-if-convert [有効] -ftree-loop-if-convert-stores [無効] @@ -150,7 +150,7 @@ -ftree-loop-ivcanon [有効] -ftree-loop-optimize [有効] -ftree-lrs [無効] - -ftree-partial-pre [無効] + -ftree-partial-pre [有効] -ftree-phiprop [有効] -ftree-pre [有効] -ftree-pta [有効] @@ -163,14 +163,14 @@ -ftree-tail-merge [有効] -ftree-ter [有効] -ftree-vect-loop-version [有効] - -ftree-vectorize [無効] + -ftree-vectorize [有効] -ftree-vrp [有効] -funit-at-a-time [有効] -funroll-all-loops [無効] -funroll-loops [無効] -funsafe-loop-optimizations [無効] -funsafe-math-optimizations [無効] - -funswitch-loops [無効] + -funswitch-loops [有効] -funwind-tables [無効] -fvar-tracking [有効] -fvar-tracking-assignments [有効]
O4で試してみる
% gcc -Q -O3 --help=optimizers > O3.list % gcc -Q -O4 --help=optimizers > O4.list % diff -u O3.list O4.list % # 同じなので差分はでません。