【问题标题】:Function optimization pass功能优化关
【发布时间】:2018-08-20 16:27:32
【问题描述】:

我正在尝试使用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

非常感谢您的回复。

注意。如果有人想看一下,(反汇编的)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


    【解决方案1】:

    好吧,在调试和阅读 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应该越晚初始化,我还是不知道为什么!!!

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 2018-12-25
      相关资源
      最近更新 更多