功能优化通过

时间:2018-08-20 16:27:33

标签: c++ optimization llvm llvm-ir

我正在尝试使用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工具(使用旧版优化界面)可以正常工作,即如果我运行

opt -O2 go_back.bc -o go_back_o2.bc

然后我得到一个新模块,其中(单个)功能go_back已优化。

非常感谢您的答复。

NB。如果有人想看一下,here会给(反汇编的)LLVM位代码文件。

更新:我已经设法通过了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对象被销毁时程序崩溃,仍然不明白为什么!

1 个答案:

答案 0 :(得分:0)

在调试并阅读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应该尽可能早地初始化,我仍然不知道为什么!