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

在自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:36:18