LLVM相关性分析是否能够输出除store&;之外的两条指令之间的相关性;负载

LLVM相关性分析是否能够输出除store&;之外的两条指令之间的相关性;负载,llvm,analysis,Llvm,Analysis,我正在使用llvm DependenceAnalysisWrapperPass来获取两条IR指令之间的依赖关系。但这种分析似乎只是加载/存储指令之间的输出相关性,而不是加载和算术指令之间的相关性。LLVM是否可以输出指令之间更全面的依赖关系 例如: %retval = alloca i32, align 4 %a = alloca i32, align 4 %b = alloca i32, align 4 %r = alloca i32, align 4 store i32

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

例如:

  %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,它输出以下依赖关系图


它表明两条加载指令分别依赖于两条存储指令。但是,它没有显示两条load指令和下面的add指令之间的依赖关系。这是意料之中的,因为DependenceAnalysisWrapperPass的代码表示它只显示存储和加载指令之间的依赖关系。我的问题是,有没有显示其他依赖项的通行证?

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


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

LLVM使用SSA,即依赖关系是明确的:每条指令都依赖于其操作数,并可传递地依赖于其自身操作数的操作数。我认为您需要详细说明这个问题,也许可以举个例子来说明您的意思。@arnt我已经更新了我的帖子以包含更多信息。您好,您的意思是我需要将此过程与每个指令的用户\u begin()、用户\u end()结合起来以获得完整的依赖项吗?是的。但是,请注意,DependenceAnalysisWrapperPass仅给出近似结果。内存允许函数间依赖,例如
boola;布尔b;void c(){a=!b;}void d(){a=true;b=true;c();if(a){…
,其中if依赖于c()中的非构造,而这又依赖于d()中的指令。内存是全局的。谢谢。现在我正在处理一个函数。