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 |