Carlos Alba via llvm-dev
2016-Feb-16 09:24 UTC
[llvm-dev] Difference between “uses” and “user”
Hi everyone, Instruction and Value classes have "Uses" and "User". What is the difference between them? I think that "Uses" gives all the instructions/values that a particular Value depends on and "User" gives all the instructions/values that depend on that particular value. Is that right? Best, Carlo -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160216/2971f991/attachment.html>
Michael Kruse via llvm-dev
2016-Feb-16 12:01 UTC
[llvm-dev] Difference between “uses” and “user”
2016-02-16 10:24 GMT+01:00 Carlos Alba via llvm-dev <llvm-dev at lists.llvm.org>:> Hi everyone, > > Instruction and Value classes have "Uses" and "User". What is the difference > between them? > > I think that "Uses" gives all the instructions/values that a particular > Value depends on and "User" gives all the instructions/values that depend on > that particular value. Is that right?Given as example the instruction %add in %add = add i32 %1, 1 [...] %sub = sub i32 %add, 1 You can think of an llvm::Use as a tuple (Instruction,ArgumentNo) Take for example the first argument of the add: (%add,0) Use::getUser() returns that Instruction (%add) Use::getOperandNo() returns that ArgumentNo (0) Use::get() returns the argument itself (%1); llvm::Use operator overloads may make the llvm::Use appear like it is the argument's llvm::Value itself add->operands() enumerates the llvm::Use(s), i.e. (%add,0) for the first argument (which is "%1") and (%add,1) for the second (which is "1") add->uses() enumerates where %add is used, i.e. (%sub,0) in this example. add->users() enumerates only the instructions which use %add, i.e. %sub in this example (without specifying the ArgumentNo) llvm::User is a base class of llvm::Instruction that implements the argument list mechanism (Lists of llvm::Value(s)). Hope that helps any corrections/additions are welcome. Michael
Carlos Alba via llvm-dev
2016-Feb-17 10:03 UTC
[llvm-dev] Difference between “uses” and “user”
So, according to your explanation, do you think that it is possible to get the value produced by an instruction? something like the following (roughly): for(auto operand : instruction->getOperandList()) if( operand -> getUser == instruction ) return true; else continue; Best, Carlo On Tue, Feb 16, 2016 at 1:01 PM, Michael Kruse <llvmdev at meinersbur.de> wrote:> 2016-02-16 10:24 GMT+01:00 Carlos Alba via llvm-dev < > llvm-dev at lists.llvm.org>: > > Hi everyone, > > > > Instruction and Value classes have "Uses" and "User". What is the > difference > > between them? > > > > I think that "Uses" gives all the instructions/values that a particular > > Value depends on and "User" gives all the instructions/values that > depend on > > that particular value. Is that right? > > Given as example the instruction %add in > > %add = add i32 %1, 1 > [...] > %sub = sub i32 %add, 1 > > You can think of an llvm::Use as a tuple (Instruction,ArgumentNo) > Take for example the first argument of the add: (%add,0) > Use::getUser() returns that Instruction (%add) > Use::getOperandNo() returns that ArgumentNo (0) > Use::get() returns the argument itself (%1); llvm::Use operator > overloads may make the llvm::Use appear like it is the argument's > llvm::Value itself > > add->operands() enumerates the llvm::Use(s), i.e. (%add,0) for the > first argument (which is "%1") and (%add,1) for the second (which is > "1") > add->uses() enumerates where %add is used, i.e. (%sub,0) in this example. > add->users() enumerates only the instructions which use %add, i.e. > %sub in this example (without specifying the ArgumentNo) > > llvm::User is a base class of llvm::Instruction that implements the > argument list mechanism (Lists of llvm::Value(s)). > > Hope that helps any corrections/additions are welcome. > > Michael >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160217/149ca9c1/attachment.html>