我是LLVM的新手,已经检查过Value
和Instruction
个类。我看到这两个类都有方法uses
和user
。它们之间有什么区别?另外,关于this post,我可以使用这些方法来确定指令是否产生值吗?
TNX。
答案 0 :(得分:9)
由于Instruction
源自Value
,因此它会继承users
和uses
两个函数。不同之处在于Value
的用户将Value
作为其操作数之一。
当您致电uses
时,您会获得所有Use
个实例的列表,其中包含Value
对特定Value
的每个用户的引用。致电users
会直接为您提供User
的列表。以下代码显示了如何使用users
和uses
。
for(auto U : V->users()){ // U is of type User*
if (auto I = dyn_cast<Instruction>(U)){
// an instruction uses V
}
}
您可以将users
视为快捷方式,因为您可以对用途执行相同操作:
for(auto U : V->uses()){ // U is of type Use*
if (auto I = dyn_cast<Instruction>(U.getUser())){
// an instruction uses V
}
}
通常,使用users
来获取Value
的所有依赖关系就足够了。
Value
使用的所有值都是操作数。这种依赖方向不是Value
的使用列表的一部分。
关于产生价值的指令的第二个问题:不能保证没有使用是因为没有产生价值。死指令可以生成值并且没有用户。此外,元数据可以使用不产生值的指令。
答案 1 :(得分:8)
我在&#34; LLVM核心库入门&#34;中找到了这个答案。书。
我们还没有提出LLVM IR最强大的方面(由 SSA表格):价值和用户界面;这些允许您轻松导航 use-def和def-use链。在LLVM内存中的IR,一个继承自的类 值意味着它定义了一个可供其他人使用的结果,而一个子类 User表示此实体使用一个或多个Value接口。功能和 指令是Value和User的子类,而BasicBlock是子类 只是价值。要理解这一点,让我们深入分析这两个类:
•Value类定义允许的use_begin()和use_end()方法 您可以遍历用户,提供访问其def-use链的简便方法。 对于每个Value类,您还可以通过getName()访问其名称 方法。这模拟了任何LLVM值都可以具有不同标识符的事实 与之相关联。例如,%add1可以标识添加的结果 指令,BB1可以识别基本块,myfunc可以识别一个功能。 Value还有一个名为replaceAllUsesWith(Value *)的强大方法, 它会浏览此值的所有用户并将其替换为 其他一些价值。这是SSA表单如何允许您的一个很好的例子 轻松替换指令并编写快速优化。你可以查看 完整界面LLVM Value Class。
•User类具有允许的op_begin()和op_end()方法 您可以快速访问它使用的所有Value接口。请注意这一点 代表use-def链。您还可以使用调用的辅助方法 replaceUsesOfWith(Value * From,Value * To)替换其使用的任何内容 值。您可以在LLVM User Class查看完整界面。