2016-06-20 12 views
0

gccの特定のバージョンでコンパイルしていくつかの最適化(-O1以上、ただし-O0ではない)を使ってコンパイルした場合にのみ動作するプログラムがあります。正確なgcc暗黙のオプションを見つけよう

このプログラムはCの意味では間違っていますが、なぜそれが-O0で機能しないのか理解する必要があります。生成されたアセンブリコードを比較して手動で検査するには大きすぎますので、-O1などの実行に対応する正確なフラグをGCCに教えてください。-O1自体は使用しません。ひとつひとつの最適化を一つずつ取り除くことで、私はその問題をよりよく理解することができます。

は、私は私の specific gcc's optimization options pageに行って、ドキュメントによると、-O1で有効になっている、すべての -fオプションを追加しようとしたが、それは(プログラムがまだ-O0のように振る舞う)十分ではなかったです。

GCCの内部機能に対応する「下位レベル」オプション-f*に基づいて、ある種の正規化コマンドラインを取得する方法はありますか?

+0

この問題は、コードにいくつかの未定義の動作があるように聞こえることに注意してください。 -fsanitize = undefinedを試して、それが何かをポップアップするかどうかを確認したいかもしれません。 – rubenvb

+1

いいえ、-O1に相当するものを-fフラグのリストとともに取得する方法はありません。 https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html「すべての最適化がフラグによって直接制御されるわけではありません」 "ほとんどの最適化は、-Oレベルがコマンドラインで設定されている場合にのみ有効になります。そうでない場合、個々の最適化フラグが指定されていても無効になります。あなたは '-O1 -fno- *'、おそらく '-fdisable- *'でかなりの数の最適化を無効にすることができますが、それでもあなたの役に立つとは思えません。 –

+0

@rubenvb私は完全に同意します、それは間違ったプログラムですが、どんなところでも厄介なアセンブリやハードウェアレベルのやりとりを扱うので、修正することはできません。それでも、この '-O'関連の振る舞いは何らかの形で理解する必要があるので、私はgcc自身にいくつかの追加情報を得るためにパッチを張らなければならないと思います。 – anol

答えて

1

フラグQ --help=target,optimizerをオプティマイザフラグ(-O2または-O1など)と組み合わせて使用​​すると、適用されたフラグを表示できます。 これは文書化されていますhere

bashを使用している場合は、以下のonelinerを使用して、 -O0と-O1)

$ diff -u <(gcc -O0 -Q --help=optimizer) <(gcc -Q --help=optimizer -O1) 
--- /dev/fd/63 2016-06-20 08:20:36.957943807 +0200 
+++ /dev/fd/62 2016-06-20 08:20:36.958943794 +0200 
@@ -11,22 +11,22 @@ 
    -fassociative-math     [disabled] 
    -fasynchronous-unwind-tables     [enabled] 
    -fauto-inc-dec      [enabled] 
- -fbranch-count-reg     [disabled] 
+ -fbranch-count-reg     [enabled] 
    -fbranch-probabilities    [disabled] 
    -fbranch-target-load-optimize  [disabled] 
    -fbranch-target-load-optimize2  [disabled] 
    -fbtr-bb-exclusive     [disabled] 
    -fcaller-saves      [disabled] 
- -fcombine-stack-adjustments   [disabled] 
- -fcompare-elim      [disabled] 
+ -fcombine-stack-adjustments   [enabled] 
+ -fcompare-elim      [enabled] 
    -fconserve-stack      [disabled] 
- -fcprop-registers     [disabled] 
+ -fcprop-registers     [enabled] 
    -fcrossjumping      [disabled] 
    -fcse-follow-jumps     [disabled] 
    -fcx-fortran-rules     [disabled] 
    -fcx-limited-range     [disabled] 
    -fdce        [enabled] 
- -fdefer-pop       [disabled] 
+ -fdefer-pop       [enabled] 
    -fdelayed-branch      [disabled] 
    -fdelete-dead-exceptions    [disabled] 
    -fdelete-null-pointer-checks     [enabled] 
@@ -38,7 +38,7 @@ 
    -fexpensive-optimizations   [disabled] 
    -ffinite-math-only     [disabled] 
    -ffloat-store      [disabled] 
- -fforward-propagate     [disabled] 
+ -fforward-propagate     [enabled] 
    -ffp-contract=      fast 
    -ffunction-cse      [enabled] 
    -fgcse        [disabled] 
@@ -48,27 +48,27 @@ 
    -fgcse-sm       [disabled] 
    -fgraphite       [disabled] 
    -fgraphite-identity     [disabled] 
- -fguess-branch-probability   [disabled] 
+ -fguess-branch-probability   [enabled] 
    -fhandle-exceptions 
    -fhoist-adjacent-loads    [disabled] 
- -fif-conversion      [disabled] 
- -fif-conversion2      [disabled] 
+ -fif-conversion      [enabled] 
+ -fif-conversion2      [enabled] 
    -findirect-inlining     [disabled] 
    -finline        [enabled] 
    -finline-atomics      [enabled] 
    -finline-functions     [disabled] 
- -finline-functions-called-once  [disabled] 
+ -finline-functions-called-once  [enabled] 
    -finline-small-functions    [disabled] 
    -fipa-cp        [disabled] 
    -fipa-cp-alignment     [disabled] 
    -fipa-cp-clone      [disabled] 
    -fipa-icf       [disabled] 
    -fipa-icf-functions     [disabled] 
- -fipa-profile      [disabled] 
+ -fipa-profile      [enabled] 
    -fipa-pta       [disabled] 
- -fipa-pure-const      [disabled] 
+ -fipa-pure-const      [enabled] 
    -fipa-ra        [disabled] 
- -fipa-reference      [disabled] 
+ -fipa-reference      [enabled] 
    -fipa-sra       [disabled] 
    -fira-algorithm=      CB 
    -fira-hoist-pressure     [enabled] 
@@ -92,7 +92,7 @@ 
    -fmath-errno       [enabled] 
    -fmodulo-sched      [disabled] 
    -fmodulo-sched-allow-regmoves  [disabled] 
- -fmove-loop-invariants    [disabled] 
+ -fmove-loop-invariants    [enabled] 
    -fnon-call-exceptions    [disabled] 
    -fnothrow-opt      [disabled] 
    -fomit-frame-pointer     [disabled] 
@@ -145,14 +145,14 @@ 
    -fshort-double      [disabled] 
    -fshort-enums      [enabled] 
    -fshort-wchar      [disabled] 
- -fshrink-wrap      [disabled] 
+ -fshrink-wrap      [enabled] 
    -fsignaling-nans      [disabled] 
    -fsigned-zeros      [enabled] 
    -fsimd-cost-model=     unlimited 
    -fsingle-precision-constant   [disabled] 
    -fsplit-ivs-in-unroller    [enabled] 
- -fsplit-wide-types     [disabled] 
- -fssa-phiopt       [disabled] 
+ -fsplit-wide-types     [enabled] 
+ -fssa-phiopt       [enabled] 
    -fstack-reuse=      all 
    -fstdarg-opt       [enabled] 
    -fstrict-aliasing     [disabled] 
@@ -164,20 +164,20 @@ 
    -ftracer        [disabled] 
    -ftrapping-math      [enabled] 
    -ftrapv        [disabled] 
- -ftree-bit-ccp      [disabled] 
+ -ftree-bit-ccp      [enabled] 
    -ftree-builtin-call-dce    [disabled] 
- -ftree-ccp       [disabled] 
- -ftree-ch       [disabled] 
+ -ftree-ccp       [enabled] 
+ -ftree-ch       [enabled] 
    -ftree-coalesce-inlined-vars     [disabled] 
    -ftree-coalesce-vars     [enabled] 
- -ftree-copy-prop      [disabled] 
- -ftree-copyrename     [disabled] 
+ -ftree-copy-prop      [enabled] 
+ -ftree-copyrename     [enabled] 
    -ftree-cselim      [enabled] 
- -ftree-dce       [disabled] 
- -ftree-dominator-opts    [disabled] 
- -ftree-dse       [disabled] 
+ -ftree-dce       [enabled] 
+ -ftree-dominator-opts    [enabled] 
+ -ftree-dse       [enabled] 
    -ftree-forwprop      [enabled] 
- -ftree-fre       [disabled] 
+ -ftree-fre       [enabled] 
    -ftree-loop-distribute-patterns  [disabled] 
    -ftree-loop-distribution    [disabled] 
    -ftree-loop-if-convert    [enabled] 
@@ -191,16 +191,16 @@ 
    -ftree-partial-pre     [disabled] 
    -ftree-phiprop      [enabled] 
    -ftree-pre       [disabled] 
- -ftree-pta       [disabled] 
+ -ftree-pta       [enabled] 
    -ftree-reassoc      [enabled] 
    -ftree-scev-cprop     [enabled] 
- -ftree-sink       [disabled] 
+ -ftree-sink       [enabled] 
    -ftree-slp-vectorize     [disabled] 
- -ftree-slsr       [disabled] 
- -ftree-sra       [disabled] 
+ -ftree-slsr       [enabled] 
+ -ftree-sra       [enabled] 
    -ftree-switch-conversion    [disabled] 
    -ftree-tail-merge     [disabled] 
- -ftree-ter       [disabled] 
+ -ftree-ter       [enabled] 
    -ftree-vectorize      [disabled] 
    -ftree-vrp       [disabled] 
    -funroll-all-loops     [disabled] 
+0

それは本当に非常に便利なオプションです!残念ながら、テストする必要のあるgcc 3.4.3ではまだ存在しませんでした( '-help = optimize'ではなく' -Q'オプションが存在しますが、私が検索したものから)そしてMarc Glisseのコメントには、とにかくもっと良いオプションはありません。gccの最近のバージョンでは非常に便利なので、私はあなたを受け入れます。 – anol

関連する問題