我正在尝试找到可以到达 llvm 中使用位置的定义位置。例如,我有一个 CFG,看起来像
a (def) / \ b c (def) \ / d (use)
因此,指令
a
c
d
如果您使用的是好的编译器,那么答案是肯定的。如果答案是否定的,那么首先运行 mem2reg pass 并了解结果不会是完美的。
(d)点使用的是一个Value。如果该值是 PHINode,则获取其“传入值”并查看它们,直到获得一组不是 PHINode 的值。这些是你的定义。 这听起来简单得令人怀疑,不是吗?它很简单,因为 SSA 语言(例如 IR)恰恰使这种工作变得简单。 SSA 语言在很多方面都可能是一种痛苦,这种痛苦是值得的,因为它们在这种事情上非常擅长。