运行 标准优化通过 LLVM 模块

Running standard optimization passes on a LLVM module

假设我有一个有效的 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 只有模块通过,但是 不是用代理包装的函数 class.

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

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

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 可以在模块的各个部分(功能级别、循环级别...)上 运行 的所有内部传递。