【发布时间】:2018-08-20 16:27:32
【问题描述】:
我正在尝试使用llvm::PassBuilder 和FunctionPassManager 来优化模块中的功能,我所做的是:
mod = ...load module from LLVM IR bitcode file...
auto lift_func = mod->getFunction("go_back");
if (not lift_func) {
llvm::errs() << "Error: cannot get function\n";
return 0;
}
auto pass_builder = llvm::PassBuilder{};
auto fa_manager = llvm::FunctionAnalysisManager{};
pass_builder.registerFunctionAnalyses(fa_manager);
auto fp_manager = pass_builder.buildFunctionSimplificationPipeline(llvm::PassBuilder::OptimizationLevel::O2);
fp_manager.run(*lift_func, fa_manager);
但程序总是在fp_manager.run 崩溃。我用pass_builder、fa_manager、fp_manager 尝试了几种方法,但没有任何效果。
够奇怪的是,LLVM 的 opt 工具(它使用旧的优化接口)没有任何问题,即如果我运行
opt -O2 go_back.bc -o go_back_o2.bc
然后我得到一个新模块,其中优化了(单个)函数go_back。
非常感谢您的回复。
注意。如果有人想看一下,(反汇编的)LLVM 位码文件会给出here。
更新:我以某种方式设法通过了fp_manager.run:
auto loop_manager = llvm::LoopAnalysisManager{};
auto cgscc_manager = llvm::CGSCCAnalysisManager{};
auto mod_manager = llvm::ModuleAnalysisManager{};
pass_builder.registerModuleAnalyses(mod_manager);
pass_builder.registerCGSCCAnalyses(cgscc_manager);
pass_builder.registerFunctionAnalyses(fa_manager);
pass_builder.registerLoopAnalyses(loop_manager);
pass_builder.crossRegisterProxies(loop_manager, fa_manager, cgscc_manager, mod_manager);
auto fp_manager = pass_builder.buildFunctionSimplificationPipeline(llvm::PassBuilder::OptimizationLevel::O2, llvm::PassBuilder::ThinLTOPhase::None, true);
fp_manager.run(*lift_func, fa_manager);
...print mod...
但是当fa_manager对象被销毁时程序崩溃了,还是不明白为什么!!!
【问题讨论】:
标签: c++ optimization llvm llvm-ir