LLVM:"使用"之间的区别和"用户"在教学或价值课程

时间:2016-02-12 18:57:35

标签: llvm llvm-ir

我是LLVM的新手,已经检查过ValueInstruction个类。我看到这两个类都有方法usesuser。它们之间有什么区别?另外,关于this post,我可以使用这些方法来确定指令是否产生值吗?

TNX。

2 个答案:

答案 0 :(得分:9)

由于Instruction源自Value,因此它会继承usersuses两个函数。不同之处在于Value的用户将Value作为其操作数之一。

当您致电uses时,您会获得所有Use个实例的列表,其中包含Value对特定Value的每个用户的引用。致电users会直接为您提供User的列表。以下代码显示了如何使用usersuses

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(V​​alue *)的强大方法, 它会浏览此值的所有用户并将其替换为 其他一些价值。这是SSA表单如何允许您的一个很好的例子 轻松替换指令并编写快速优化。你可以查看 完整界面LLVM Value Class

•User类具有允许的op_begin()和op_end()方法 您可以快速访问它使用的所有Value接口。请注意这一点 代表use-def链。您还可以使用调用的辅助方法 replaceUsesOfWith(V​​alue * From,Value * To)替换其使用的任何内容 值。您可以在LLVM User Class查看完整界面。