LLVM依赖性分析是否能够输出除存储和加载以外的两个指令之间的依赖性?

问题描述 投票:0回答:1

我正在使用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,它输出以下依赖关系图

Dependency Graph

这表明两个加载指令分别取决于两个存储指令。但是,它没有显示两个加载指令和以下添加指令之间的依赖关系。这是预料之中的,因为DependenceAnalysisWrapperPass的代码表示仅显示存储和加载指令之间的依赖关系。我的问题是,是否还有其他通行证显示其他依赖性?

llvm analysis
1个回答
0
投票

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

每个指令的操作数正是它所依赖的指令(或其他值)。这是LLVM的一般原理。您看到的传递存在的原因是加载和存储是一个例外。但是,加载和存储是only例外。

© www.soinside.com 2019 - 2024. All rights reserved.