LLVM:;使用「;及;“用户”;在教学或价值观课上

LLVM:;使用「;及;“用户”;在教学或价值观课上,llvm,llvm-ir,Llvm,Llvm Ir,我是LLVM新手,已经检查了值和指令课程。我发现这两个类都有uses和user方法。它们之间有什么区别?另外,关于,我是否可以使用这些方法来确定指令是否生成值 tnx.由于指令是从值派生出来的,因此它继承了用户和使用两个函数。区别在于值的用户将值作为其操作数之一 当您调用uses时,您会得到一个所有Use实例的列表,其中包含从值到特定值的每个用户的引用。调用users可以直接获得User的列表。下面的代码显示了如何使用用户和使用 for(auto U : V->users()){ //

我是LLVM新手,已经检查了
指令
课程。我发现这两个类都有
uses
user
方法。它们之间有什么区别?另外,关于,我是否可以使用这些方法来确定指令是否生成值


tnx.

由于
指令
是从
派生出来的,因此它继承了
用户
使用
两个函数。区别在于
的用户将
作为其操作数之一

当您调用
uses
时,您会得到一个所有
Use
实例的列表,其中包含从
到特定
的每个用户的引用。调用
users
可以直接获得
User
的列表。下面的代码显示了如何使用
用户
使用

for(auto U : V->users()){  // U is of type User*
     if (auto I = dyn_cast<Instruction>(U)){
        // an instruction uses V
     }
}
通常,使用
用户
即可获得
值的所有依赖项

值所使用的所有值都是操作数。此依赖方向不是
值的使用列表的一部分


关于产生价值的指令的第二个问题:不能保证没有使用是因为没有产生价值。死指令可以产生一个值,并且没有用户。此外,元数据可以使用不产生值的指令。

我在《LLVM核心库入门》一书中找到了这个答案

我们还没有介绍LLVM IR最强大的方面(由 SSA表格):价值和用户界面;这使您可以轻松地浏览 使用def和def使用链条。在LLVM内存中IR中,从 值意味着它定义了一个其他人可以使用的结果,而子类 of User表示该实体使用一个或多个值接口。功能与 指令是Value和User的子类,而BasicBlock是一个子类 有价值的。为了理解这一点,让我们深入分析这两个类:

•Value类定义了use\u begin()和use\u end()方法来允许 您需要迭代用户,提供一种访问其def使用链的简单方法。 对于每个值类,还可以通过getName()访问其名称 方法。这模拟了任何LLVM值都可以具有不同标识符的事实 与之相关的。例如,%add1可以标识添加的结果 指令,BB1可以标识基本块,myfunc可以标识函数。 Value还有一个名为replaceAlluseWith(Value*)的强大方法, 它浏览此值的所有用户,并将其替换为 其他一些价值。这是SSA表单如何允许您 轻松替换指令并编写快速优化。您可以查看 完整的界面在

•User类具有op_begin()和op_end()方法,允许 您需要快速访问它使用的所有值接口。请注意 表示使用def链。您还可以使用名为 ReplaceSofwith(Value*From,Value*To)替换其任何已使用的
价值观您可以在处查看完整界面。

因此,Uses给出了特定值所依赖的所有指令/值,用户给出了依赖于该特定值的所有指令/值,对吗?用户获取指令,并使用get获取特定值。当你想用另一个变量(值)替换一个“变量”时,你必须替换每个用法。可以安全地假设
用户数()
总是等于
用法数()
。请注意,不是每个用户都是指令,也就是说,用户也可能是表达式。
for(auto U : V->uses()){  // U is of type Use*
     if (auto I = dyn_cast<Instruction>(U.getUser())){
        // an instruction uses V
     }
}