LLVMの最適化の概要
コンパイラの最適化において、重要視されるのが最適化の適用順序です。
LLVMは、低レイヤ(LLVM IRレベル)の最適化を行ったあと、CodeGeneratorがマシン固有(MIレベル)の最適化を行う。
LLVM標準の適用順序による最適化は下記オプションを指定することにより実行することができる。
よだん
標準の最適化を何段走らせても出力は向上しなかったりします。しかし絶えず内部で変換が行われたりします。
大きな要因としては PHI を LCSSA 形式にしたり正規化したりを繰り返してしまうからです。
LLVM IR レベルの最適化オプション
-O3 #元来 -On は llvm-gcc -On を真似るためのものです。
-funit-at-a-time
-std-link-opts
-std-compile-opts
※-std-compile-optsは-O3+funit-at-a-timeと同等
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PassManagerBuilder.h?view=markup
MI レベルの最適化オプション
-O3
(うろおぼえだが X86 CodeGen の場合は -O1 -O2 -O3 で動作が変わらなかったような気がする。)
BitCodeを速度最優先でコンパイルする方法
(1) std-link-opts -> std-compile-opts
$ llvm-ld a.bc b.bc -o c.bc
$ opt -std-compile-opts c.bc -o c.opt.bc
(2) std-compile-opts -> std-link-opts
$ opt -std-compile-opts a.bc -o a.opt.bc
$ opt -std-compile-opts b.bc -o b.opt.bc
$ llvm-ld a.opt.bc b.opt.bc -o c.bc
速度最優先でCodeGenerateする方法
下記のオプションを追記すると速くなるはず。
-regalloc=pbqp ※食わせるモノによってはべらぼうに最適化時間を要する! ※レジスタアロケーションの時間が爆発する場合は、デフォルトのlinearscanでアロケーションしよう!
opt -std-compile-opts -std-link-opts ってやるとどんなパススケジューリングされるんだっけ?
std-compile-optsとstd-link-optsの順番でAddPassされることになるため、そのとおりの順番で走ります。
- std手続き間最適化前半
- std関数内最適化前半
- stdループ最適化
- std関数内最適化後半
- std手続き間最適化後半
- LTOonly_Internalize
- LTO手続き間最適化前半
- LTOonly_GlobalModRef
- LTO関数最適化
- LTO手続き間最適化後半
- 最終更新:2011-06-27 22:58:41