You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:43:22