如何从LLVM IR中获取数据依赖信息?有哪些可用的工具或opt命令?
LLVM IR指令数据依赖查询方法
你之前使用的-da pass本质是面向循环内数组访问的依赖分析工具,默认不会输出普通寄存器级别的def-use(定义-使用)依赖信息,加上你没加-analyze参数(分析类pass必须加这个参数才会输出结果),所以没有输出属于正常情况。要获取你描述的这类指令间数据依赖,可以用以下几种LLVM自带的工具:
1. 直接打印def-use链(文本输出,最方便)
旧 pass manager 版本命令
opt -enable-new-pm=0 -analyze -def-use source_ir.ll
运行后会直接输出每条指令的定义被哪些后续指令使用的明细,针对你给出的示例代码,输出会明确标记%div被%mul11依赖、%38被%mul11依赖,完全匹配你的需求。
新 pass manager 版本命令
opt -passes='print<def-use>' -disable-output source_ir.ll
输出内容和旧PM版本完全一致,适配高版本LLVM默认使用新PM的场景。
2. 可视化查看依赖关系
如果需要更直观的CFG+依赖可视化,可以使用dot-cfg pass:
opt -enable-new-pm=0 -dot-cfg source_ir.ll
运行后会为每个函数生成对应的.dot格式CFG图,图中自带def-use依赖边,用Graphviz工具打开即可直观看到所有指令间的依赖关系。
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

