运行标准优化传递给LLVM模块

Mat*_*her 2 c++ jit llvm compiler-optimization llvm-c++-api

说我有一个有效的LLVM模块:

std::unique_ptr<llvm::Module> module;
Run Code Online (Sandbox Code Playgroud)

我想在其上运行LLVM传统优化:

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

不幸的是,该调用崩溃并进行了调试,显示moduleAnalysisManager仅通过模块,而没有通过代理类包装的函数通过。

我应该如何设置modulePassManager以处理特定级别的所有(模块)通行证?我没有单独的功能,因此无法仅对它们运行功能传递。

Mat*_*her 6

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

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);
Run Code Online (Sandbox Code Playgroud)

然后,我们分别注册每个经理,然后交叉注册他们。这意味着此处的管理器数量是由设计固定的,如果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);
Run Code Online (Sandbox Code Playgroud)

一旦passBuilder被创建,我们终于可以让优化过程与所涉及的调用模块moduleAnalysisManager

llvm::ModulePassManager modulePassManager =
    passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O3);
modulePassManager.run(*module, moduleAnalysisManager);
Run Code Online (Sandbox Code Playgroud)

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