2017-07-18 5 views
0

自分のプログラムにllvmliteの最適化パスを使用しようとしています。私はパス機能としての私のコードのために次の関数を定義していますなぜllvmliteの最適化のレベルを変更するときに違いはありませんか?

def create_pass_manager_builder(opt=3, loop_vectorize=False, slp_vectorize=False): 
    pmb = llvm.create_pass_manager_builder() 
    pmb.opt_level = opt 
    pmb.loop_vectorize = loop_vectorize 
    pmb.populate = populate 
    pmb.add_dead_code_elimination_pass = add_dead_code_elimination_pass 
    pmb.slp_vectorize = slp_vectorize 
    pmb.inlining_threshold = _inlining_threshold(opt) 
    return pmb 

と私は次の使用してそれを実行しよう:

module_ref = llvm1.parse_assembly(str(module)) 
pmb = llvm.create_pass_manager_builder() 
pmb.opt_level = 3 
pm = llvm.create_module_pass_manager() 
pmb.populate(pm) 
pm.run(module_ref) 

これを持って、私は私のコードのいくつかの最適化を持っています。ただし、最適化レベルを3から2または0に変更すると、最適化の違いはありません。最適化のレベルを変更してその違いを確認するにはどうすればよいですか。

答えて

1

最適化では、最適化レベルを単独で使用しません。むしろあなたがパスマネージャーを構築する方法、またはこの場合、ポピュレート機能がどのように機能するかはあなた次第です。ちょっと調べてみると、あなたのモジュールパスマネージャーを使用すると、あなたのpopulate関数がこれを呼び出すでしょう。http://llvm.org/doxygen/PassManagerBuilder_8cpp_source.html#l00402 optLevelへの参照がいくつかあり、そのコードに最適化されているかどうかを確認できます。最適化するコードがこれらの最適化を実行していない場合、違いは見られません。

もう一つの懸念は、あなたが実際に私が推測2に固定されたオプトレベルとllvmliteにおけるいくつかのデフォルトの定義を持って適切なcreate_pass_manager_builder関数を呼び出している場合、これは

pmb = create_pass_manager_builder() 

ではなく、あるべき私は正確にはわからないです

pmb = llvm.create_pass_manager_builder() 
関連する問題