多くの最適化の頭字語を見てきました。
dce, inline, constmerge, constprop, dse, licm, gvn, instcombine, mem2reg, scalarrepl
それがデッド コードの除去であると推測できdce
ますが、他にも多くの問題があります。
説明付きのLLVM最適化のリストを含むWebページはありますか?それらのそれぞれは正確に何をしますか?
よろしく、ロイ
多くの最適化の頭字語を見てきました。
dce, inline, constmerge, constprop, dse, licm, gvn, instcombine, mem2reg, scalarrepl
それがデッド コードの除去であると推測できdce
ますが、他にも多くの問題があります。
説明付きのLLVM最適化のリストを含むWebページはありますか?それらのそれぞれは正確に何をしますか?
よろしく、ロイ
LLVM のドキュメントには、分析パスと変換パスのリストが含まれています。リストしたものはすべて変換パスに該当します。時には簡潔なドキュメントについて詳しく説明するには:
inline
インライン関数 (duh!)。constmerge
同一の定数の重複を排除します。constprop
単純な定数の折り畳みを行います (定数引数を持つ命令のみ)dse
明らかに無意味なメモリ書き込みを排除します ( a = 1; a = 2;
->と同等a = 2;
)。licm
、ループ不変コードモーションは、すべての反復で同じである計算をループから移動して、一度だけ実行されるようにします。instcombine
複数の命令を 1 つの同等の命令 (たとえば、a + 1 + 1
->と同等a + 2
) に置き換えます。mem2reg
スタック割り当てを SSA レジスタに変換します。フロントエンドは、ローカルにスペースを割り当ててalloca
それらをポインターとして使用するだけで、はるかに簡単になりますが、最適化パスは SSA で機能するため、このパスはalloca
できるだけ多くの を SSA に変換します。scalarrepl
集約型を個々のメンバーに置き換えます (たとえば、構造体オブジェクトを 2 つの i32 メンバーでジャグリングする代わりに、2 つの i32 レジスタを使用します)。