首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数优化通道

函数优化通道
EN

Stack Overflow用户
提问于 2018-08-21 00:27:33
回答 1查看 284关注 0票数 4

我正在尝试使用llvm::PassBuilderFunctionPassManager来优化模块中的函数,我所做的是:

代码语言:javascript
复制
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_builderfa_managerfp_manager的几种方法,但都不起作用。

奇怪的是,LLVM的opt工具(它使用遗留的优化接口)可以正常工作,也就是说,如果我运行

代码语言:javascript
复制
opt -O2 go_back.bc -o go_back_o2.bc

然后我得到了一个新模块,其中(单个)函数go_back进行了优化。

非常感谢您的回复。

注意:如果有人想看一下,(反汇编的) LLVM文件是here的。

更新:我以某种方式设法通过了fp_manager.run

代码语言:javascript
复制
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对象被销毁时,程序崩溃了,仍然不知道为什么!

EN

回答 1

Stack Overflow用户

发布于 2018-08-22 22:13:24

在调试和阅读LLVM源代码之后,我设法使其正常工作,如下所示

代码语言:javascript
复制
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 loop_manager = llvm::LoopAnalysisManager{};
auto cgscc_manager = llvm::CGSCCAnalysisManager{};
auto mod_manager = llvm::ModuleAnalysisManager{};
auto fa_manager = llvm::FunctionAnalysisManager{}; // magic: it's must be here

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);

...anything...

fa_manager应该越晚初始化越好,我还是不知道为什么!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51934964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档