Gccでは、 マニュアル は、特定の最適化引数(-O3
、-Os
などの観点から-funswitch-loops
、-fcompare-elim
などが何に変換されるかを説明します。 )
clangと同じ情報を探しています。
オンライン と、一般情報のみを提供するman clang
を調べました(-O2
は-O1
、-Os
より高速に最適化、...)また、Stack Overflowを見て、 this を見つけましたが、引用されたソースファイルに関連するものは見つかりませんでした。
編集:答えは見つかりましたが、興味があるのはまだ興味があります -すべての最適化パスと-Ox
で選択されたパスを手動で文書化します。現在、 this パスのリストが見つかりましたが、最適化レベルには何もありません。
this 関連する質問を見つけました。
まとめると、コンパイラーの最適化パスについて調べるには:
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
Geoff Nixonの答え(+1)で指摘されているように、clang
はさらにいくつかのより高いレベルの最適化を実行します。
echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#
個々のパスのドキュメントが利用可能です こちら 。
version 6.0では、パスは次のとおりです。
ベースライン(-O0
):
opt
sets:-tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrierclang
adds:-mdisable-fp-elim -mrelax-all-O1
は-O0
に基づいています
opt
adds:-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-再関連付け-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-シンク-instsimplify -div-r em-pairs -verify -ee-instrument -early-cse -lower-expectclang
adds:-momit-leaf-frame-pointerclang
drops:-mdisable-fp-elim -mrelax-all-O2
は-O1
に基づいています
opt
adds:-inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmergeopt
drops:-always-inlineclang
adds:-vectorize-loops -vectorize-slp-O3
は-O2
に基づいています
opt
adds:-callsite-splitting -argpromotion-Ofast
は-O3
に基づいており、clang
では有効ですが、opt
では有効ではありません
clang
adds:-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
drops:-libcalls-shrinkwrapおよび-pgo-memopt-opt-Oz
は-Os
に基づいています
opt
drops:-slp-vectorizerversion 3.8では、パスは次のとおりです。
ベースライン(-O0
):
opt
sets:-targetlibinfo -tti -verifyclang
adds:-mdisable-fp-elim -mrelax-all-O1
は-O0
に基づいています
opt
adds:-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-再関連付け-strip-dead-prototypes -loops -basicaa -correlated-propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-assumptions -lazy-値情報-Prune-eh -jump-threading -loop-rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-trackerclang
adds:-momit-leaf-frame-pointerclang
drops:-mdisable-fp-elim -mrelax-all-O2
は-O1
に基づいています
opt
adds:-elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmergeopt
drops:-always-inlineclang
adds:-vectorize-loops -vectorize-slp-O3
は-O2
に基づいています
opt
adds:-argpromotion-Ofast
は-O3
に基づいており、clang
では有効ですが、opt
では有効ではありません
clang
adds:-fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no- infs-Os
は-O2
と同じです
-Oz
は-Os
に基づいています
opt
drops:-slp-vectorizerclang
drops:-vectorize-loopsversion 3.7では、パスは次のようになります(上記のコマンドの解析された出力)。
デフォルト(-O0):-targetlibinfo -verify -tti
-O1は-O0に基づいています
-O2は-01に基づいています
-O3は-O2に基づいています
-Osは-O2と同じです
-Ozは-Osに基づいています
バージョン3.6の場合、パスはGYUNGMIN KIMの投稿に記載されているとおりです。
version 3.5では、パスは次のようになります(上記のコマンドの解析された出力)。
デフォルト(-O0):-targetlibinfo -verify -verify-di
-O1は-O0に基づいています
-O2は-01に基づいています
-O3は-O2に基づいています
-Osは-O2と同じです
-Ozは-Osに基づいています
version 3.4では、パスは次のようになります(上記のコマンドの解析された出力):
-O0:-targetlibinfo -preverify -domtree -verify
-O1は-O0に基づいています
-O2は-01に基づいています
-O3は-O2に基づいています
-Osは-O2と同じです
-Ozは-O2に基づいています
version 3.2では、パスは次のようになります(上記のコマンドの解析された出力)。
-O0:-targetlibinfo -preverify -domtree -verify
-O1は-O0に基づいています
-O2は-01に基づいています
-O3は-O2に基づいています
-Osは-O2と同じです
-Ozは-Osと同じです
Edit[2014年3月]リストから重複を削除しました。
編集[2014年4月]3.4のドキュメントリンク+オプションを追加
Edit[2014年9月]3.5のオプションを追加
Edit[2015年12月]3.7のオプションを追加し、3.6の既存の回答に言及
Edit[2016年5月]3.8のオプションを追加しました。optとclangの両方で、 clang(オプトに対して)
Edit[nov 2018]6.0のオプションを追加
@Antoineの回答(およびリンクされている他の質問)は、有効になっているLLVM最適化を正確に説明していますが、他にもClang固有のオプション(ASTの低下に影響するオプション)がいくつかあります-O[0|1|2|3|fast]
フラグの影響を受けます。
これらを以下で見ることができます:
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 -\#\#\#
たとえば、-O0
は-mrelax-all
を有効にし、-O1
は-vectorize-loops
と-vectorize-slp
を有効にし、-Ofast
は-menable-no-infs
、-menable-no-nans
、-menable-unsafe-fp-math
、-ffp-contract=fast
および-ffast-math
を有効にします。
@Techogrebo:
はい、必ずしも他の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
LLVM 3.6-O1
引数を渡す:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -Prune-eh -inline-コスト-常にインライン-functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify- lcssa -loop-rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine-遅延値情報-ジャンプスレッド-相関伝播-domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplify -lcssa -branch-prob -block-freq -scalar-進化-loop-vectorize -instcombine -simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-a仮定-strip-dead-prototypes -verify -verify-di
-O1ベースの-O2ベース
追加:-inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge
削除:-always-inline
-O2に基づく-O3
追加:-argpromotion