120

gcc の場合、マニュアルでは、 、 などが特定の最適化引数 ( 、 など) に関して何に変換されるかを説明してい-O3ます。-Os-funswitch-loops-fcompare-elim

clang について同じ情報を探しています。

私はオンラインで見て、man clang一般的な情報のみを提供します(-O2より積極的-O1-Os最適化し、サイズを最適化します...)、またここでスタックオーバーフローを見て、これを見つけましたが、引用されたソースファイルに関連するものは何も見つかりませんでした.

編集:答えを見つけましたが、すべての最適化パスと によって選択されたパスを文書化したユーザーマニュアルへのリンクを誰かが持っているかどうかに興味があります。現在、このパスのリストを見つけましが、最適化レベルについては何も見つかりませんでした。-Ox

4

3 に答える 3

191

この関連する質問を見つけました。

要約すると、コンパイラの最適化パスについて調べるには、次のようにします。

llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments

Geoff Nixonの回答(+1)で指摘されているように、clangさらにいくつかのより高いレベルの最適化を実行します。これは次の方法で取得できます。

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#

個々のパスのドキュメントはこちらから入手できます。

-O次のような高レベルのフラグを変更した場合の効果を比較できます。

diff -wy --suppress-common-lines  \
  <(echo 'int;' | clang -xc     - -o /dev/null -\#\#\# 2>&1 | tr " " "\n" | grep -v /tmp) \
  <(echo 'int;' | clang -xc -O0 - -o /dev/null -\#\#\# 2>&1 | tr " " "\n" | grep -v /tmp)
# will tell you that -O0 is indeed the default.

バージョン6.0では、パスは次のとおりです。

  • ベースライン(-O0):

    • optセット:-tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clang追加:-mdisable-fp-elim -mrelax-all
  • -O1に基づいています-O0

    • opt追加します:-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-propagation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy -branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative-execution -lazy-value-info -jump-threading -correlated-propagation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-simplify -lcssa-verification -lcssa -scalar-evolution -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-accesses -loop-distribute-loop-vectorize -loop-load-elim -alignment-from-assumptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pairs -verify -ee-instrument -early-cse -lower-expect
    • clang追加:-momit-leaf-frame-pointer
    • clangドロップ:-mdisable-fp-elim -mrelax-all
  • -O2に基づいています-O1

    • opt追加:-inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • optドロップ:-常に-インライン
    • clang追加:-vectorize-loops -vectorize-slp
  • -O3に基づいています-O2

    • opt追加:-callsite-splitting -argpromotion
  • -Ofastに基づいており-O3、で有効ですが、でclangはありませんopt

    • clang追加:-fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-math-only
  • -Osと類似しています-O2

    • optドロップ:-libcalls-shrinkwrapおよび-pgo-memopt-opt
  • -Ozに基づいています-Os

    • optドロップ:-slp-vectorizer

バージョン3.8では、パスは次のとおりです。

  • ベースライン(-O0):

    • optセット:-targetlibinfo -tti -verify
    • clang追加:-mdisable-fp-elim -mrelax-all
  • -O1に基づいています-O0

    • opt追加:-globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simplify -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs -basiccg -loop-idiom -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-accesses -memcpyopt -loop-deletion -reassociate -strip-dead-prototypes -loops -basicaa -correlated -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clang追加:-momit-leaf-frame-pointer
    • clangドロップ:-mdisable-fp-elim -mrelax-all
  • -O2に基づいています-O1

    • opt追加:-elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optドロップ:-常に-インライン
    • clang追加:-vectorize-loops -vectorize-slp
  • -O3に基づいています-O2

    • opt追加:-argpromotion
  • -Ofastに基づいており-O3、で有効ですが、でclangはありませんopt

    • clang追加:-fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Osと同じです-O2

  • -Ozに基づいています-Os

    • optドロップ:-slp-vectorizer
    • clangドロップ:-vectorize-loops

----------

バージョン3.7では、パスは次のとおりです(上記のコマンドの解析出力)。

  • デフォルト(-O0):-targetlibinfo -verify -tti

  • -O1は-O0に基づいています

    • 追加:-sccp -loop-simplify -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -assumption-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -alignment-from-assumptions -early-cse -inline -cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep-always-inline
  • -O2は-01に基づいています

    • 追加:-elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • 削除:-always-inline
  • -O3は-O2に基づいています

    • 追加:-argpromotion -verif
  • -Osは-O2と同じです

  • -Ozは-Osに基づいています

    • 削除:-slp-vectorizer

----------

バージョン3.6の場合、パスはGYUNGMINKIMの投稿に記載されているとおりです。


----------

バージョン3.5では、パスは次のとおりです(上記のコマンドの解析出力)。

  • デフォルト(-O0):-targetlibinfo -verify -verify-di

  • -O1は-O0に基づいています

    • 追加:-correlated-propagation -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-simplify -loop-vectorize -inline-cost -branch-prob -early-cse -lazy-value-info -loop-rotate -strip-dead-prototypes -loop-deletion -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-expect -licm -loop-idiom -adce -domtree -lcssa
  • -O2は-01に基づいています

    • 追加:-gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • 削除:-always-inline
  • -O3は-O2に基づいています

    • 追加:-argpromotion
  • -Osは-O2と同じです

  • -Ozは-Osに基づいています

    • 削除:-slp-vectorizer

----------

バージョン3.4では、パスは次のとおりです(上記のコマンドの解析出力)。

  • -O0:-targetlibinfo -preverify -domtree -verify

  • -O1は-O0に基づいています

    • 追加:-adce -always-inline -basicaa -basiccg -correlated-propagation -deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -licm -loop-deletion -loop-idiom -loop-rotate -loop-simplify -loop-unroll -loop-unswitch -loops -lower-expect -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2は-01に基づいています

    • 追加:-barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • 削除:-always-inline
  • -O3は-O2に基づいています

    • 追加:-argpromotion
  • -Osは-O2と同じです

  • -Ozは-O2に基づいています

    • 削除:-barrier -loop-vectorize -slp-vectorizer

----------

バージョン3.2では、パスは次のとおりです(上記のコマンドの解析出力)。

  • -O0:-targetlibinfo -preverify -domtree -verify

  • -O1は-O0に基づいています

    • 追加:-sroa -early-cse -lower-expect -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplify-libcalls -lazy-value -info -jump-threading -correlated-propagation -tailcallelim -reassociate -loops -loop-simplify -lcssa -loop-rotate -licm -loop-unswitch -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
  • -O2は-01に基づいています

    • 追加:-inline -globaldce -constmerge
    • 削除:-always-inline
  • -O3は-O2に基づいています

    • 追加:-argpromotion
  • -Osは-O2と同じです

  • -Ozは-Osと同じです


-------------

編集 [2014年3月]リストから重複を削除しました。

編集 [2014年4月]ドキュメントリンクと3.4のオプションを追加

編集 [2014年9月] 3.5の追加オプション

[2015年12月] 3.7の追加オプションを編集し、3.6の既存の回答に言及します

編集 [2016年5月]オプションとclangの両方について、3.8の追加オプションを編集し、clangの既存の回答に言及します(optではなく)

編集 [2018年11月] 6.0のオプションを追加

于 2013-03-21T12:55:19.560 に答える
21

@Antoineの回答(およびリンクされている他の質問)は、有効になっているLLVM-O[0|1|2|3|fast]の最適化を正確に説明していますが、フラグの影響を受けるClang固有のオプション(ASTの低下に影響するもの)がいくつかあります。

これらは次の方法で確認できます。

echo 'int;' | clang -xc -O0 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O1 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O2 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -Ofast - -o /dev/null -\#\#\#

たとえば、-O0enable -mrelax-all-O1enable-vectorize-loopsおよび-vectorize-slp、および-Ofastenable -menable-no-infs-menable-no-nans-menable-unsafe-fp-math-ffp-contract=fastおよび-ffast-math


@テコグレボ:

はい、いいえ、他の LLVM ツールは必ずしも必要ではありません。試す:

echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options

また、Clang だけで調べたり変更したりできる、より詳細なオプションがたくさんあります。

次のいくつかを試してください。

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

于 2014-12-20T04:09:50.313 に答える