[解決済み] Clangの最適化レベル
質問
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用オプションの追加
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例