必须显式声明依赖,不能直接 new 或 getAnalysis 两次以上;Legacy PM 中唯一合法方式是 getAnalysis<DominatorTreeWrapperPass>().getDomTree();New PM 中需用 AM.getResult<DominatorTreeAnalysis>(F),且修改 CFG 后须手动 invalidate。

必须显式声明依赖,不能直接 new 或 getAnalysis 两次以上
Legacy PM 中调用 getAnalysis<DominatorTreeWrapperPass>() 是唯一合法方式
Legacy Pass Manager 不允许在 runOnFunction() 里临时构造或缓存 DominatorTree 实例。你看到的 getAnalysis<DominatorTreeWrapperPass>().getDomTree() 这一连串调用,本质是:先拿到 DominatorTreeWrapperPass 实例(它内部已构建好支配树),再从中取出 DominatorTree& 引用。
常见错误现象:
- 直接
new DominatorTree(F)—— 构造出的树未经过验证,后续dominates()可能返回错误结果 - 在
runOnFunction()多次调用getAnalysis<...>()—— 虽不崩溃,但违反 Pass Manager 的生命周期约定,可能触发断言或未定义行为 - 漏写
AU.addRequired<DominatorTreeWrapperPass>()—— 运行时 panic:“Analysis not available”
New PM 下要用 getAnalysis<DominatorTreeAnalysis>() 并传入 Function&
New Pass Manager 彻底重构了分析传递机制:DominatorTreeWrapperPass 已废弃,取而代之的是无状态的 DominatorTreeAnalysis 类。它不持有任何实例,只提供 run() 接口生成新 DominatorTree。
使用场景:
- 你的 Pass 继承自
FunctionPass(New PM)时,run()签名是PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) - 获取方式变为:
DominatorTree &DT = AM.getResult<DominatorTreeAnalysis>(F); - 注意:每次
getResult都会复用已有分析结果,不会重复计算;但如果上游 Pass 修改了 CFG,该结果可能过期
两种 PM 的支配树对象类型不同,不可混用
Legacy 返回的是 DominatorTree&(实际是 DominatorTreeBase<BasicBlock, false> 的别名),New PM 返回的是 DominatorTree&(但底层是 DominatorTreeBase<BasicBlock, true>)。虽然名字一样,但成员函数签名、迭代器行为、甚至 dominates(A, B) 对 unreachable block 的处理逻辑都不同。
容易踩的坑:
- 把 Legacy 版本的
DT.dominates(A, B)代码直接复制到 New PM Pass 里 —— 编译不过,因为 New 版本要求第三个参数const DominatorTree &显式传入 - 试图用
DT.getRootNode()在 New PM 中取根节点 —— 该方法已被移除,改用DT.getRoot()返回BasicBlock* - 在 New PM 中误写成
AM.getResult<DominatorTreeWrapperPass>(F)—— 编译失败,DominatorTreeWrapperPass不再注册为 Analysis
最易被忽略的一点:New PM 的 DominatorTreeAnalysis 默认不自动更新。如果你的 Pass 修改了 CFG(比如拆分 BB 或插入分支),必须手动调用 AM.invalidate<DominatorTreeAnalysis>(F, PreservedAnalyses::none()),否则后续 Pass 拿到的是脏数据。

















