说我有一个有效的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
来处理特定级别的所有(模块)通行证?我没有单独的功能,因此无法仅对它们运行功能传递。
答案 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可以在模块的各个部分上运行的所有内部传递(功能级别,循环级别...)。