web-dev-qa-db-ja.com

Clang最適化レベル

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

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

オンライン と、一般情報のみを提供するman clangを調べました(-O2-O1-Osより高速に最適化、...)また、Stack Overflowを見て、 this を見つけましたが、引用されたソースファイルに関連するものは見つかりませんでした。

編集:答えは見つかりましたが、興味があるのはまだ興味があります -すべての最適化パスと-Oxで選択されたパスを手動で文書化します。現在、 this パスのリストが見つかりましたが、最適化レベルには何もありません。

83
Antoine

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 -barrier
    • clang 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-expect
    • clang adds:-momit-leaf-frame-pointer
    • clang drops:-mdisable-fp-elim -mrelax-all
  • -O2-O1に基づいています

    • opt adds:-inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • opt drops:-always-inline
    • clang 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-vectorizer

version 3.8では、パスは次のとおりです。

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

    • opt sets:-targetlibinfo -tti -verify
    • clang 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-tracker
    • clang adds:-momit-leaf-frame-pointer
    • clang drops:-mdisable-fp-elim -mrelax-all
  • -O2-O1に基づいています

    • opt adds:-elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • opt drops:-always-inline
    • clang 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-vectorizer
    • clang drops:-vectorize-loops

version 3.7では、パスは次のようになります(上記のコマンドの解析された出力)。

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

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

    • adds:-sccp -loop-simplify -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -assume-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -Prune-eh -loop-unswitch -仮定からの整列-初期-cse-インラインコスト-simplifycfg-ストリップデッドプロトタイプ-tbaa -sroa -no-aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq-スカラー進化-memdep -always-inline
  • -O2は-01に基づいています

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

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

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

    • removes:-slp-vectorizer

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


version 3.5では、パスは次のようになります(上記のコマンドの解析された出力)。

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

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

    • adds:-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に基づいています

    • adds:-gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • removes:-always-inline
  • -O3は-O2に基づいています

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

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

    • removes:-slp-vectorizer

version 3.4では、パスは次のようになります(上記のコマンドの解析された出力):

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

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

    • adds:-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に基づいています

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

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

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

    • removes:-barrier -loop-vectorize -slp-vectorizer

version 3.2では、パスは次のようになります(上記のコマンドの解析された出力)。

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

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

    • adds:-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に基づいています

    • adds:-inline -globaldce -constmerge
    • removes:-always-inline
  • -O3は-O2に基づいています

    • adds:-argpromotion
  • -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のオプションを追加

141
Antoine

@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

13
Geoff Nixon

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

3
GYUNGMIN KIM