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以处理特定级别的所有(模块)通行证?我没有单独的功能,因此无法仅对它们运行功能传递。
正确的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可以在模块的各个部分上运行的所有内部传递(功能级别,循环级别...)。
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |