New PM是彻底重写的现代Pass基础设施,不兼容Legacy PM:注册方式、生命周期、类型系统均不同;Legacy依赖继承与宏注册,New PM采用概念约束与声明式注册;Analysis管理从隐式全局变为显式可组合、线程安全。

新 Pass 管理器(New PM)不是旧 Pass 管理器(Legacy PM)的“升级版”,而是彻底重写的、面向现代 C++ 和模块化设计的一套新基础设施——它不兼容 Legacy PM 的注册方式、生命周期模型和类型系统,强行混用会导致 PassManager 崩溃或 Pass 被跳过。
Legacy Pass 必须继承特定基类,New Pass 只需满足概念约束
Legacy PM 强依赖继承链:ModulePass、FunctionPass、LoopPass 等都必须显式继承对应基类,且重写 runOnModule、runOnFunction 等虚函数。一旦继承错(比如把 FunctionPass 当成 ModulePass 注册),运行时不会报错,但 Pass 根本不执行。
New PM 完全抛弃继承,改用 PassInfoMixin + 概念(Concept-based polymorphism)。你只要让类模板参数满足 PassConcept,比如:
struct MyFunctionPass : PassInfoMixin<MyFunctionPass> {
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};
编译期就检查签名是否合法;不满足 PreservedAnalyses 返回类型或参数列表,直接编译失败,不给你留 runtime 黑盒。
Pass 注册和 Pipeline 构建方式完全不同
Legacy PM 注册靠宏:INITIALIZE_PASS 系列宏 + 全局变量初始化,依赖静态构造函数顺序,跨翻译单元时容易失效;注册后还得手动调用 addPass 插入到 PassManager 实例中。
New PM 使用声明式注册机制:
-
registerPass<MyFunctionPass>("my-function-pass", "My custom function pass")是唯一注册入口 - Pipeline 由
PassBuilder自动构建,支持 YAML 配置、命令行-passes字符串(如-passes="function(my-function-pass),loop(licm)") - 不再需要手写
addPass调用,也不再有PM.add(new MyFunctionPass())这种裸指针管理
这意味着:Legacy PM 下你能用 new 动态构造任意次 Pass 实例;New PM 下每个 Pass 类型默认只存在一个实例(单例语义),多次注册同名 Pass 会触发断言失败。
分析结果(Analysis)的生命周期与复用逻辑彻底重构
Legacy PM 中,Analysis 是隐式依赖的全局状态:getAnalysis<SomeAnalysis>() 返回引用,但谁保存、谁释放、是否线程安全全靠开发者自己把握;多个 Pass 同时访问同一 Analysis 实例可能引发竞态。
New PM 把 Analysis 变成显式、可组合、带缓存策略的对象:
- 每个
Analysis必须实现AnalysisInfoMixin,并声明其输入依赖(RequiredAnalyses)和输出保留集(PreservedAnalyses) -
FunctionAnalysisManager自动按需计算、缓存、失效Analysis结果,且默认线程安全(基于std::shared_mutex) -
Pass不再通过getAnalysis查找,而是通过AM.getResult<SomeAnalysis>(F)显式请求,语义清晰、可测试性强
这导致一个关键差异:Legacy PM 下你可以把 LoopInfo 当作“永远有效”的全局对象反复取用;New PM 下如果某个 Pass 修改了循环结构但没正确声明 PreservedAnalyses::none() 或 preserve<LoopAnalysis>(),后续 getResult<LoopInfo> 就会重新计算——这是正确行为,不是 bug。
最易被忽略的点是:LLVM 15+ 默认启用 New PM,但 Clang 命令行仍默认走 Legacy PM 路径(除非加 -fexperimental-new-pass-manager),而 opt 工具从 LLVM 14 开始已完全切换。写 Pass 时若没确认所用工具链的 PM 类型,很可能在 opt 里跑通,却在 clang -O2 下完全不触发。

















