从LLVM旧版FunctionPassManager迁移至新版PassManager的技术咨询
迁移LLVM旧版FunctionPassManager至新版PassManager及适配TransformLayer指南
一、替换Legacy FunctionPassManager为新版PassManager
1. 初始化新版优化管道
旧版用FunctionPassManager逐个加pass的写法,直接换成用PassBuilder构建管道:
#include "llvm/Passes/PassBuilder.h" #include "llvm/Passes/OptimizationLevel.h" // 创建PassBuilder,用来搭建优化流程 llvm::PassBuilder PB; // 构建函数级优化管道(对应旧版FunctionPassManager) llvm::FunctionPassManager FPM; // 两种方式添加优化: // 方式1:按预设优化级别批量添加(比如O2级别的函数优化) PB.buildFunctionSimplificationPipeline(FPM, llvm::OptimizationLevel::O2, llvm::PassBuilder::OptimizationMode::Default); // 方式2:手动添加单个pass FPM.addPass(llvm::InstCombinePass()); FPM.addPass(llvm::ReassociatePass());
2. 运行优化
新版PassManager依赖分析管理器,必须先注册分析再运行:
// 创建函数分析管理器,注册必要的分析组件 llvm::FunctionAnalysisManager FAM; PB.registerFunctionAnalyses(FAM); // 对目标函数执行优化 FPM.run(TheFunction, FAM);
如果是模块级优化,换成ModulePassManager和ModuleAnalysisManager,步骤完全一致。
二、适配TransformLayer让optimizeModule返回ThreadSafeModule
1. 实现返回ThreadSafeModule的优化函数
直接写一个包装函数,处理线程安全模块的优化:
llvm::ThreadSafeModule optimizeModule(llvm::ThreadSafeModule TSM, const llvm::TargetMachine *TM, llvm::PassBuilder &PB) { // 获取原始模块引用 auto &M = *TSM.getModule(); llvm::ModuleAnalysisManager MAM; // 注册模块分析组件 PB.registerModuleAnalyses(MAM); // 注册函数级分析并建立跨级关联 llvm::FunctionAnalysisManager FAM; PB.registerFunctionAnalyses(FAM); PB.crossRegisterProxies(FAM, MAM); // 构建模块优化管道 llvm::ModulePassManager MPM; PB.buildPerModuleDefaultPipeline(MPM, llvm::OptimizationLevel::O2); // 执行优化 MPM.run(M, MAM); // 返回处理后的线程安全模块 return TSM; }
2. 配置TransformLayer的优化回调
在JIT的TransformLayer中设置这个优化函数:
// 假设已创建ORC JIT实例 auto &J = getMyJITInstance(); auto &TransformLayer = J.getTransformLayer(); // 绑定优化逻辑到TransformLayer TransformLayer.setTransform( [&PB, TM](llvm::ThreadSafeModule TSM, llvm::orc::MaterializationResponsibility R) { return optimizeModule(std::move(TSM), TM, PB); } );
三、核心注意点
- 新版PassManager是分析驱动的,必须注册对应的分析管理器,手动加pass时要确保依赖的分析已注册(用PassBuilder的build方法会自动处理依赖)。
- 操作ThreadSafeModule时,必须通过
getModule()获取原始模块,不能直接修改包装类,处理完后返回原包装实例即可。 - 如果是Kaleidoscope那种逐函数JIT的场景,也可以在将函数加入JIT前,先用FunctionPassManager单独优化函数,再包装成ThreadSafeModule传入。
内容的提问来源于stack exchange,提问作者ngbv2128
相关产品推荐
相关产品推荐

