首页 > 解决方案 > LLVM 依赖分析是否能够输出存储和加载以外的两条指令之间的依赖关系?

问题描述

我正在使用 llvm DependenceAnalysisWrapperPass 来获取两个 IR 指令之间的依赖关系。但似乎这种分析只输出加载/存储指令之间的依赖关系,而不是说加载和算术指令之间的依赖关系。LLVM中是否有任何pass可以输出指令间更全面的依赖关系?

例如:

  %retval = alloca i32, align 4
  %a = alloca i32, align 4
  %b = alloca i32, align 4
  %r = alloca i32, align 4
  store i32 0, i32* %retval, align 4
  store i32 1, i32* %a, align 4
  store i32 2, i32* %b, align 4
  %0 = load i32, i32* %a, align 4
  %1 = load i32, i32* %b, align 4
  %add = add nsw i32 %0, %1
  store i32 %add, i32* %r, align 4
  %2 = load i32, i32* %r, align 4
  ret i32 %2

通过使用 DependenceAnalysisWrapperPass,它输出以下依赖图

依赖图

它表明两条加载指令分别依赖于两条存储指令。但是,它没有显示两个加载指令和下面的添加指令之间的依赖关系。这是意料之中的,因为 DependenceAnalysisWrapperPass 的代码说它只显示了存储和加载指令之间的依赖关系。我的问题是是否有任何可用的通行证也显示其他依赖关系?

标签: llvmanalysis

解决方案


源代码显示了您想要的信息。

每条指令的操作数正是它所依赖的那些指令(或其他值)。这是 LLVM 的一般原则。您看到的 pass 存在是因为加载和存储是一个例外。但是,加载和存储是唯一的例外。


推荐阅读