代码之家  ›  专栏  ›  技术社区  ›  Matthieu Brucher

在LLVM模块上运行标准优化传递

  •  1
  • Matthieu Brucher  · 技术社区  · 7 年前

    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

    1 回复  |  直到 7 年前
        1
  •  7
  •   Matthieu Brucher    7 年前

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

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