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 
 % # 同じなので差分はでません。

Emacs 24以上を使うなら color-themeではなく、Emacsの themeフレームワークを使おう

color-themeでEmacsの見た目をきれいにする - Qiita


Emacs 24以上を使っているという前提があるのですが、独自のテーマを作る場合は
color-themeより、Emacs 24から導入された themeフレームワークを使う
ことをおすすめです。


機能的には変わらないと思うのですが、color-themeをインストール
する必要がないというのがお手軽です。~/.emacs.d以下においておけば、
load-theme関数を使って利用することができます。

サンプル

試しに @さんの molokaiを themeフレームワーク版に
書き換えてみました。コードはほとんど同じです。カーソル等のごく一部の
パラメータの指定が違うのと、各項目を quoteするぐらいです。

(deftheme molokai
  "Molokai color theme")

(custom-theme-set-faces
 'molokai
 ;; 背景・文字・カーソル
 '(cursor ((t (:foreground "#F8F8F0"))))
 '(default ((t (:background "#1B1D1E" :foreground "#F8F8F2"))))

 ;; 選択範囲
 '(region ((t (:background "#403D3D"))))

 ;; モードライン
 '(mode-line ((t (:foreground "#F8F8F2" :background "#000000"
                  :box (:line-width 1 :color "#000000" :style released-button)))))
 '(mode-line-buffer-id ((t (:foreground nil :background nil))))
 '(mode-line-inactive ((t (:foreground "#BCBCBC" :background "#333333"
                           :box (:line-width 1 :color "#333333")))))

 ;; ハイライト
 '(highlight ((t (:foreground "#000000" :background "#C4BE89"))))
 '(hl-line ((t (:background "#293739"))))

 ;; 関数名
 '(font-lock-function-name-face ((t (:foreground "#FFFFFF"))))

 ;; 変数名・変数の内容
 '(font-lock-variable-name-face ((t (:foreground "#FFFFFF"))))
 '(font-lock-string-face ((t (:foreground "#E6DB74"))))

 ;; 特定キーワード
 '(font-lock-keyword-face ((t (:foreground "#F92672"))))

 ;; Boolean
 '(font-lock-constant-face((t (:foreground "#AE81BC"))))

 ;; 括弧
 '(show-paren-match-face ((t (:foreground "#1B1D1E" :background "#FD971F"))))
 '(paren-face ((t (:foreground "#A6E22A" :background nil))))

 ;; コメント
 '(font-lock-comment-face ((t (:foreground "#74715D"))))

 ;; CSS
 '(css-selector ((t (:foreground "#66D9EF"))))
 '(css-property ((t (:foreground "#FD971F"))))

 ;; nXML-mode
 ;; タグ名
 '(nxml-element-local-name ((t (:foreground "#F92672"))))
 ;; 属性
 '(nxml-attribute-local-name ((t (:foreground "#66D9EF"))))
 ;; 括弧
 '(nxml-tag-delimiter ((t (:foreground "#A6E22A"))))
 ;; DOCTYPE宣言
 '(nxml-markup-declaration-delimiter ((t (:foreground "#74715D"))))

 ;; dired
 '(dired-directory ((t (:foreground "#A6E22A"))))
 '(dired-symlink ((t (:foreground "#66D9EF"))))

 ;; MMM-mode
 '(mmm-default-submode-face ((t (:foreground nil :background "#000000")))))

;;;###autoload
(when load-file-name
  (add-to-list 'custom-theme-load-path
               (file-name-as-directory (file-name-directory load-file-name))))

(provide-theme 'molokai)
themeをロードするための設定
(load-theme 'molokai t)
(enable-theme 'molokai)
イメージ

おわりに

まだ Emacs24を使っていない人もいるので、color-themeを完全に
捨て去るというのは難しいかと思いますが、これから新規に作るという
のであれば、Emacsの持つ themeフレームワークを使って themeを作成
した方が良いかと思います。

GCC 4.7の最適化オプション比較表

GCCの各オプティマイズレベルで有効になる最適化を調べる - Life is very short


GCC 4.7版。"-Ofast"を追加しました。"-Ofast"は規約を一部
無視した最適化を行うようです。"-O3"より高速になるよう意図
されています。


なお GCC 4.8では "-Og"という最適化とデバッグ機能を兼ね備えた
オプションが追加されるそうです。需要がわかりづらいですが・・・。

表生成スクリプト

#!/usr/bin/env perl
use strict;
use warnings;

$ENV{LANG} = 'C';

my @levels = qw(-O0 -O1 -O2 -O3 -Os -Ofast);

my @base = qw(gcc -- -Q --help=optimizers);

my %optimize;
for my $level (@levels) {
    my @cmd = @base;
    $cmd[1] = $level;

    open my $fh, "-|", @cmd or die "Can't exec @cmd";

    while (my $line = <$fh>) {
        chomp $line;

        next unless $line =~ m{(?:enabled|disabled)};

        if ($line =~ m{(\S+) \s+ \[ ([^\]]+) \]}xms) {
            my ($option, $flag) = ($1, $2);

            if ($flag eq 'enabled') {
                $optimize{$level}->{$option} = 1;
            } else {
                $optimize{$level}->{$option} = 0;
            }
        }
    }
    close $fh;
}

print "|*|";
print "*$_|" for @levels;
print "\n";

for my $key (sort keys %{$optimize{'-O0'}}) {
    print "|$key|";
    for my $level (@levels) {
        printf "%s|",  $optimize{$level}->{$key} == 1 ? "o" : 'x';
    }
    print "\n";
}

比較表

-O0 -O1 -O2 -O3 -Os -Ofast
-falign-functions x x o o o o
-falign-jumps x x o o o o
-falign-labels x x o o o o
-falign-loops x x o o o o
-fasynchronous-unwind-tables o o o o o o
-fbranch-count-reg o o o o o o
-fbranch-probabilities x x x x x x
-fbranch-target-load-optimize x x x x x x
-fbranch-target-load-optimize2 x x x x x x
-fbtr-bb-exclusive x x x x x x
-fcaller-saves x x o o o o
-fcombine-stack-adjustments x o o o o o
-fcommon o o o o o o
-fcompare-elim x o o o o o
-fconserve-stack x x x x x x
-fcprop-registers x o o o o o
-fcrossjumping x x o o o o
-fcse-follow-jumps x x o o o o
-fcx-fortran-rules x x x x x x
-fcx-limited-range x x x x x o
-fdata-sections x x x x x x
-fdce o o o o o o
-fdefer-pop x o o o o o
-fdelayed-branch x x x x x x
-fdelete-null-pointer-checks o o o o o o
-fdevirtualize x x o o o o
-fdse o o o o o o
-fearly-inlining o o o o o o
-fexceptions x x x x x x
-fexpensive-optimizations x x o o o o
-ffinite-math-only x x x x x o
-ffloat-store x x x x x x
-fforward-propagate x o o o o o
-fgcse x x o o o o
-fgcse-after-reload x x x o x o
-fgcse-las x x x x x x
-fgcse-lm o o o o o o
-fgcse-sm x x x x x x
-fgraphite-identity x x x x x x
-fguess-branch-probability x o o o o o
-fif-conversion x o o o o o
-fif-conversion2 x o o o o o
-finline-atomics o o o o o o
-finline-functions x x x o o o
-finline-functions-called-once x o o o o o
-finline-small-functions x x o o o o
-fipa-cp x x o o o o
-fipa-cp-clone x x x o x o
-fipa-matrix-reorg x x x x x x
-fipa-profile x o o o o o
-fipa-pta x x x x x x
-fipa-pure-const x o o o o o
-fipa-reference x o o o o o
-fipa-sra x x o o o o
-fivopts o o o o o o
-fjump-tables o o o o o o
-floop-block x x x x x x
-floop-flatten x x x x x x
-floop-interchange x x x x x x
-floop-parallelize-all x x x x x x
-floop-strip-mine x x x x x x
-fmath-errno o o o o o x
-fmerge-all-constants x x x x x x
-fmerge-constants x o o o o o
-fmodulo-sched x x x x x x
-fmove-loop-invariants o o o o o o
-fno-threadsafe-statics o o o o o o
-fnon-call-exceptions x x x x x x
-fnothrow-opt x x x x x x
-fomit-frame-pointer x x x x x x
-foptimize-register-move x x o o o o
-foptimize-sibling-calls x x o o o o
-foptimize-strlen x x o o x o
-fpack-struct x x x x x x
-fpeel-loops x x x x x x
-fpeephole o o o o o o
-fpeephole2 x x o o o o
-fpredictive-commoning x x x o x o
-fprefetch-loop-arrays o o o o o o
-freg-struct-return x x x x x x
-fregmove x x o o o o
-frename-registers o o o o o o
-freorder-blocks x x o o o o
-freorder-blocks-and-partition x x x x x x
-freorder-functions x x o o o o
-frerun-cse-after-loop x x o o o o
-freschedule-modulo-scheduled-loops x x x x x x
-frounding-math x x x x x x
-frtti o o o o o o
-fsched-critical-path-heuristic o o o o o o
-fsched-dep-count-heuristic o o o o o o
-fsched-group-heuristic o o o o o o
-fsched-interblock o o o o o o
-fsched-last-insn-heuristic o o o o o o
-fsched-pressure x x x x x x
-fsched-rank-heuristic o o o o o o
-fsched-spec o o o o o o
-fsched-spec-insn-heuristic o o o o o o
-fsched-spec-load x x x x x x
-fsched-spec-load-dangerous x x x x x x
-fsched-stalled-insns x x x x x x
-fsched-stalled-insns-dep o o o o o o
-fsched2-use-superblocks x x x x x x
-fschedule-insns x x x x x x
-fschedule-insns2 x x o o o o
-fsection-anchors x x x x x x
-fsel-sched-pipelining x x x x x x
-fsel-sched-pipelining-outer-loops x x x x x x
-fsel-sched-reschedule-pipelined x x x x x x
-fselective-scheduling x x x x x x
-fselective-scheduling2 x x x x x x
-fshort-double x x x x x x
-fshort-enums o o o o o o
-fshort-wchar x x x x x x
-fshrink-wrap x o o o o o
-fsignaling-nans x x x x x x
-fsigned-zeros o o o o o x
-fsingle-precision-constant x x x x x x
-fsplit-ivs-in-unroller o o o o o o
-fsplit-wide-types x o o o o o
-fstrict-aliasing x x o o o o
-fstrict-enums x x x x x x
-fthread-jumps x x o o o o
-ftoplevel-reorder o o o o o o
-ftrapping-math o o o o o x
-ftrapv x x x x x x
-ftree-bit-ccp x o o o o o
-ftree-builtin-call-dce x x o o o o
-ftree-ccp x o o o o o
-ftree-ch x o o o o o
-ftree-copy-prop x o o o o o
-ftree-copyrename x o o o o o
-ftree-cselim o o o o o o
-ftree-dce x o o o o o
-ftree-dominator-opts x o o o o o
-ftree-dse x o o o o o
-ftree-forwprop o o o o o o
-ftree-fre x o o o o o
-ftree-loop-distribute-patterns x x x o x o
-ftree-loop-distribution x x x x x x
-ftree-loop-if-convert o o o o o o
-ftree-loop-if-convert-stores x x x x x x
-ftree-loop-im o o o o o o
-ftree-loop-ivcanon o o o o o o
-ftree-loop-optimize o o o o o o
-ftree-lrs x x x x x x
-ftree-partial-pre x x x o x o
-ftree-phiprop o o o o o o
-ftree-pre x x o o o o
-ftree-pta o o o o o o
-ftree-reassoc o o o o o o
-ftree-scev-cprop o o o o o o
-ftree-sink x o o o o o
-ftree-slp-vectorize o o o o o o
-ftree-sra x o o o o o
-ftree-switch-conversion x x o o o o
-ftree-tail-merge x x o o o o
-ftree-ter x o o o o o
-ftree-vect-loop-version o o o o o o
-ftree-vectorize x x x o x o
-ftree-vrp x x o o o o
-funit-at-a-time o o o o o o
-funroll-all-loops x x x x x x
-funroll-loops x x x x x x
-funsafe-loop-optimizations x x x x x x
-funsafe-math-optimizations x x x x x o
-funswitch-loops x x x o x o
-funwind-tables x x x x x x
-fvar-tracking o o o o o o
-fvar-tracking-assignments o o o o o o
-fvar-tracking-assignments-toggle x x x x x x
-fvar-tracking-uninit x x x x x x
-fvariable-expansion-in-unroller x x x x x x
-fvect-cost-model o o o o o o
-fvpt x x x x x x
-fweb o o o o o o
-fwhole-program x x x x x x
-fwrapv x x x x x x