在自定义LLVM Pass中调用DependenceAnalysis获取DependenceInfo遇阻
自定义LLVM Pass获取DependenceAnalysis结果的正确方法
正确实现方式
LLVM新PassManager体系下,分析Pass的结果必须通过分析管理器的getResult接口获取,不能手动实例化调用run方法。以下是正确代码示例:
// 自定义ModulePass的run函数 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) { // 获取FunctionAnalysisManager实例 FunctionAnalysisManager &FAM = MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); for (Function &F : M) { if (F.isDeclaration()) continue; // 通过FAM自动触发DependenceAnalysis计算并获取结果 DependenceInfo &DI = FAM.getResult<DependenceAnalysis>(F); // 示例:使用DependenceInfo分析指令依赖 for (BasicBlock &BB : F) { for (Instruction &I : BB) { for (Instruction &J : make_range(std::next(I.getIterator()), BB.end())) { auto Dep = DI.depends(&I, &J); if (Dep) { // 处理具体的依赖关系 } } } } } return PreservedAnalyses::all(); }
错误方法分析
第一种方法错误根源
直接实例化DependenceAnalysis并调用run方法,违反了LLVM PassManager的设计规范:
- 分析Pass的命令行选项(如
enable-fs-discriminator)由PassManager统一注册,手动实例化会导致选项重复注册,触发报错。 - 手动调用
run无法保证分析依赖链的正确性,可能得到无效结果。
第二种方法错误根源
DependenceAnalysis属于分析Pass,而非变换Pass:
- 分析Pass的
run方法返回的是具体分析结果(DependenceInfo),而变换Pass才需要返回PreservedAnalyses来告知PassManager哪些分析结果仍有效,因此不能直接将分析Pass添加到ModulePassManager中。
内容的提问来源于stack exchange,提问作者christbl
相关产品推荐
相关产品推荐

