我正在使用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,它输出以下依赖关系图
这表明两个加载指令分别取决于两个存储指令。但是,它没有显示两个加载指令和以下添加指令之间的依赖关系。这是预料之中的,因为DependenceAnalysisWrapperPass的代码表示仅显示存储和加载指令之间的依赖关系。我的问题是,是否还有其他通行证显示其他依赖性?
源代码显示您想要的信息。
每个指令的操作数正是它所依赖的指令(或其他值)。这是LLVM的一般原理。您看到的传递存在的原因是加载和存储是一个例外。但是,加载和存储是only例外。