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

时间:2018-11-27 14:24:06

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

说我有一个有效的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来处理特定级别的所有(模块)通行证?我没有单独的功能,因此无法仅对它们运行功能传递。

1 个答案:

答案 0 :(得分:5)

正确的LLVM方法是创建所有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);

然后,我们分别注册每个经理,然后交叉注册他们。这意味着此处的经理人数是由设计固定的,如果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可以在模块的各个部分上运行的所有内部传递(功能级别,循环级别...)。