gpt4 book ai didi

c++ - 功能优化通

转载 作者:太空狗 更新时间:2023-10-29 23:11:06 25 4
gpt4 key购买 nike

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

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 工具(它使用传统的优化接口(interface))工作没有任何问题,即如果我运行

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对象被销毁时程序崩溃了,还是不明白为什么!!!

最佳答案

嗯,在调试和阅读 LLVM 源代码后,我设法使它工作,如下

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应该越晚初始化越好,我还是不知道为什么!!!

关于c++ - 功能优化通,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51934964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com