运行 标准优化通过 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 可以在模块的各个部分(功能级别、循环级别...)上 运行 的所有内部传递。
假设我有一个有效的 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 可以在模块的各个部分(功能级别、循环级别...)上 运行 的所有内部传递。