【问题标题】:Running standard optimization passes on a LLVM module在 LLVM 模块上运行标准优化传递
【发布时间】:2019-04-29 07:42:21
【问题描述】:

假设我有一个有效的 LLVM 模块:

std::unique_ptr<llvm::Module> module;

我想在它上面运行 LLVM 传统优化通道:

llvm::PassBuilder passBuilder;
llvm::ModulePassManager modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O3);
llvm::ModuleAnalysisManager moduleAnalysisManager;
passBuilder.registerModuleAnalyses(moduleAnalysisManager);
modulePassManager.run(*module, moduleAnalysisManager);

不幸的是,调用崩溃和调试显示moduleAnalysisManager只有模块通过,但是 不是用代理类包装的函数。

我应该如何设置modulePassManager 来处理特定级别的所有(模块)通行证?我没有单独的函数,所以我不能只在它们上运行函数传递。

【问题讨论】:

    标签: c++ llvm compiler-optimization jit llvm-c++-api


    【解决方案1】:

    正确的 LLVM 方法是创建所有 analysisManagers,然后将它们链接在一起。让我们从创建它们开始:

    llvm::PassBuilder passBuilder;
    llvm::LoopAnalysisManager loopAnalysisManager(true); // true is just to output debug info
    llvm::FunctionAnalysisManager functionAnalysisManager(true);
    llvm::CGSCCAnalysisManager cGSCCAnalysisManager(true);
    llvm::ModuleAnalysisManager moduleAnalysisManager(true);
    

    然后我们分别注册每个经理,然后我们交叉注册他们。这意味着这里的管理器数量是设计固定的,如果 LLVM(此时为 7 个)更改了管理器的数量,则需要进行调整:

    passBuilder.registerModuleAnalyses(moduleAnalysisManager);
    passBuilder.registerCGSCCAnalyses(cGSCCAnalysisManager);
    passBuilder.registerFunctionAnalyses(functionAnalysisManager);
    passBuilder.registerLoopAnalyses(loopAnalysisManager);
    // This is the important line:
    passBuilder.crossRegisterProxies(
        loopAnalysisManager, functionAnalysisManager, cGSCCAnalysisManager, moduleAnalysisManager);
    

    创建passBuilder 后,我们终于可以通过调用moduleAnalysisManager 对模块进行优化。

    llvm::ModulePassManager modulePassManager =
        passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O3);
    modulePassManager.run(*module, moduleAnalysisManager);
    

    这将运行模块级传递以及 LLVM 可以在模块的各个部分上运行的所有内部传递(函数级、循环级...)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2018-10-08
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多