1. ホーム
  2. clang

[解決済み] Clangの最適化レベル

2022-09-10 07:05:54

質問

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

私は clang に対して同じ情報を探しています。 .

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

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

どのように解決するのですか?

私は この に関連する質問です。

要約すると、コンパイラの最適化パスについて調べることです。

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

で指摘されているように ジェフ・ニクソン の回答 (+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- -LAZY-BCFG -globals-aa -prune-eh -always-inline -functionattrins -instcombine -simplifycfg -basiccg -globals-aa -plune-eh -always-inline -functionattrins 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- -flq 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-pair -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 が追加されます。 : -ベクタライズ-ループ -ベクタライズ-スラップ
  • -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 -mreassociate -fno-trapping-math-ffast-math-finite-math-only。
  • -Os -O2

    • opt ドロップ : -libcalls-shrinkwrap と -pgo-memopt-opt を使用します。
  • -Oz -Os

    • opt ドロップ : -slp-vectorizer

とは バージョン 3.8 では、以下のようなパスがあります。

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

    • opt セット : -targetlibinfo -tti -ベリファイ
    • 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 -roa -loop-unswitch -float2int -loower- -loop-unswitch -loop-unswitch -block-free -float-unswitch -loop-unswitch 期待する -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 が追加されます。 : -ベクタライズ-ループ -ベクタライズ-スラップ
  • -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 ドロップ : -ベクタイズループ

----------

とは バージョン 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 -...ループアクセス -assumption-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domree -dse -Loop -simplify -loop-propagation 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
    • は削除されます。 : 常にインライン
  • -O3は-O2が基になっている

    • が追加されます。 : -argpromotion -verif
  • -Os は -O2 と同じです。

  • -Oz は -Os をベースにしています。

    • が削除されます。 : -slp-vectorizer

----------

について バージョン3.6 は、GYUNGMIN KIM さんの投稿に書かれている通りです。


----------

とは バージョン3.5 の場合、パスは以下のようになります(上記コマンドの解析出力)。

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

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

    • が追加されます。 : 相関伝播 -basiccg -simplifycfg -no-aa -ジャンプスレッディング -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- -demeprototype -dead-prototypes -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -mempyopt -バリア -ブロックフレック -loop-simplify -loop-vectorize -inline-cost 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
    • は削除されます。 : 常にインライン
  • -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- -イディオム -loop -loop -unroll -loop -unswitch -loops -lower-expect -memcpy -loop -loop -implify -loop -Loop -Loop -Loop -Loop -Loop -Loop -Loop -Loop イディオム -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 を基準としています。

    • が追加されます。 : -バリア -constmerge -domtree -globaldce -gvn -inline -ループベクタライズ -preverify -slp-vectorizer -targetlibinfo -ベリファイ
    • は削除されます。 : 常にインライン
  • -O3は-O2が基になっている

    • が追加されます。 : -argpromotion
  • -Os は -O2 と同じです。

  • -Oz は -O2 をベースとしています。

    • が削除されます。 : -バリア -ループベクタライズ -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- -propargabry -loops -loop-simplify -lcssa -looprotate -licm -loopunswitch -loop-simplify -loop-unswitch -loop-unswitch 伝播 -tailcallelim -reassociate -loops -loop-simplify -lcssa -loop-rotate -licm -loop-unswitch -スカラー進化 -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
  • -O2 は -01 を基準としています。

    • が追加されます。 : -inline -globaldce -constmerge
    • を削除します。 : 常にインライン
  • -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月】の記事] 3.8のオプション、optとclangの両方を追加し、clangの既存の回答(optに対して)について言及しました。

編集 [2018年11月】の記事] 6.0用オプションの追加