2011-10-05 9 views
10

LLVMのさまざまな最適化レベルがどのようなものに対応しているかを具体的に知りたいと思います。LLVMはどの最適化を実行しますか?

つまり、llvm(またはclangまたはopt)の "-0x"オプションを使用すると、どの最適化パスが正確に(フロントエンドの外で)実行されたかを知りたいと思います。 対応するツールの「人」は、この問題に関する多くの情報を提供していません(gccのもののopositeへ)。

私はこの便利なページ:http://llvm.org/docs/Passes.htmlを知っていますが、 "-Ox"オプションに関する情報は提供していません。 デバッグや冗長オプション(特に "opt --help"の情報を使用しています)を探していましたが、便利なオプションが見つかりませんでした。

補足として、私は、さまざまなLLVMツールとclangがオプションを独自の方法で解析する別個のドライバを使用するというコードを解析することに気付きました。これらのドライバはすべて「-Ox」オプションに関して似ていますか?

編集:私は、オプションの「O1」のために次の出力を与える「OPT」ツール、のためのオプション「-debugパス=引数」が見つかりました:

Pass Arguments: -targetdata -no-aa -tbaa -targetlibinfo -basicaa -simplifycfg -domtree -scalarrepl -early-cse -lower-expect 
Pass Arguments: -targetlibinfo -targetdata -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -scalarrepl-ssa -domtree -early-cse -simplify-libcalls -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -instcombine -strip-dead-prototypes -preverify -domtree -verify 

これは何から近いです私は欲しかったが、2つの質問が残ります:

  • なぜ2つのリストがありますか?

  • 他のツール、特に「clang」には同様のオプションがありますか? (私のテストによると、「-debugパス=引数は、」打ち鳴らす動作しません)

編集:ツール「オプトイン」のオプション「-debugパス=構造は、」もっと与えますユーザーフレンドリーなデータ(http://llvm.org/docs/WritingAnLLVMPass.html

答えて

11

なぜ2つのリストがありますか?

ファンクションとモジュールパスには独自のパスマネージャがあり、別々に印刷します。

他のツールのための任意の同様のオプション、あなたは-mllvm -debugパス=引数を使用することができ打ち鳴らすと、特に「打ち鳴らす」

があります。

+0

十分なフェア!ありがとう! –

+0

@echristo:LLVMの関数とモジュールのパスの違いについてもっと詳しく説明できますか?たとえば、標準の最適化パス(O1,2,3、...)のいずれかを選択するために、ソースコードファイルfoo.c全体を渡しています。次は何が起こるのだろう ? – Amir

+1

@Amir遅れて申し訳ありません、ちょうどこれを見ました。 とにかく、モジュールパスは、一般にすべての関数などで機能し、グローバルな可視性を持つものです。ファンクションパスは、一度に個々のファンクションに作用し、個々のファンクションの分析まで、情報を前後に渡すことはできません。 一般に、データレイアウト、グローバルコード生成、手続間解析などはモジュールであり、gvnは関数パスです。あなたはそれが何であるかを見つけるために各パスのソースを見ることができます。より具体的な質問や詳細情報がありますか? – echristo

関連する問題