我正在尝试将llvmlite的优化传递用于我自己的程序。我为代码定义了以下函数作为pass函数:
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时,优化没有区别。如何更改优化级别并查看差异?
答案 0 :(得分:1)
优化本身不使用优化级别。这取决于你如何构建传递管理器,或者在这种情况下,populate函数是如何构建它的。挖掘一下我发现,在你刚才使用模块传递管理器的情况下,你的populate函数会调用这个http://llvm.org/doxygen/PassManagerBuilder_8cpp_source.html#l00402有一些对optLevel的引用,你可以检查一下是否真的适用于你的优化码。如果您优化的代码没有经过这些优化,那么您将看不到任何差异。
另一个问题是我不确定你是否正在调用正确的create_pass_manager_builder函数,该函数在llvmlite中实际上有一些默认的定义,其中固定的选择级别为2.我想这应该是
pmb = create_pass_manager_builder()
而不是
pmb = llvm.create_pass_manager_builder()