llvm - 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 的代码说它只显示了存储和加载指令之间的依赖关系。我的问题是是否有任何可用的通行证也显示其他依赖关系?
解决方案
源代码显示了您想要的信息。
每条指令的操作数正是它所依赖的那些指令(或其他值)。这是 LLVM 的一般原则。您看到的 pass 存在是因为加载和存储是一个例外。但是,加载和存储是唯一的例外。
推荐阅读
- react-native - 我安装了 react-native-barcode-builder 并得到一个空白矩形
- kotlin - 为什么无法访问的语句方法不会导致编译错误?
- docker - 如何从 Concourse CI 中的 git 资源构建 docker-compose 容器?
- python - Tkinter 在终端中工作但不在 sublime 中(mac)
- java - Android 上的 AnyChart 着色网格
- php - 如何在已由 mysql 填充的下拉列表中设置值
- c# - VSIX:从 VS2017 移植到 VS2019 的步骤
- python - 如何从特定文件夹中的 Outlook 中的不同帐户读取 Outlook 电子邮件?
- php - Laravel 注册页面未加载
- java - 如何在 java-Mysql 选择查询中使用带有参数的正则表达式?