読者です 読者をやめる 読者になる 読者になる

GCCの最適化オプションは "-O3"までしかない

gcc

ここ十数年ぐらいの 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 
 % # 同じなので差分はでません。