about llvm::use

Hello, all

I don’t quite understand the llvm::use class, from the class ref, I read that:

“A Use represents the edge between a Value definition and its users.This is notionally a two-dimensional linked list”

I can image that it’s like an edge between the operand<->User, but how to comprehend the “two-dimensional linked list” ?

(Instruction derives from User that derives from Value)

And I found “use_iterator()” in Value, for example: a Value ‘v’, if it’s an operand of many Instructions ‘i1,i2,i3…’, then in my understanding, uses of v are just i1, i2, i3… but what’s the difference between use and user in this case ??

Besides, if the Value ‘v’ here is itself an Instruction, then what are its ‘uses’ and ‘users’ ?? I feel that the result of an instruction can be an operand of another instruction, but it should not be regarded as the instruction itself right ??

Very confused…hope I can get some help to clarify my thoughts…

thanks

Hello, all

I don't quite understand the llvm::use class, from the class ref, I read
that:

*"A Use <http://llvm.org/docs/doxygen/html/classllvm_1_1Use.html&gt;
represents the edge between a Value
<http://llvm.org/docs/doxygen/html/classllvm_1_1Value.html&gt; definition and
its users.This is notionally a two-dimensional linked list"*

I can image that it's like an edge between the operand<->User, but how to
comprehend the "two-dimensional linked list" ?

Dunno what that comment is getting at, other than it covers both the user
and the use itself.

(*Instruction derives from User that derives from Value*)

And I found "use_iterator()" in Value, for example: a Value 'v', if it's
an operand of many Instructions 'i1,i2,i3...', then in my understanding,
uses of v are just i1, i2, i3...

no, they are the specific parts of i1, i2, i3 that refer to v.

but what's the difference between use and user in this case ??

Use points directly to the *place in the User* that the Value appears
User is the *thing holding the Use*.

So here, i1, i2, i3 are *Users* of Value v. If you use the user_iterator,
that is what it will return

If i1, i2, i3 were looked at as just arrays of operands, like so:

i1 = [foo, v]
i2 = [v, foo]
i3 = [foo, v, bar]

Then the user iterator for v would give you i1, i2, and i3. Those are the
containers that have the use in them.
The use iterator for v will give you something that points to &i1[1],
&i2[0], &i3[1], because those are the actual pointers to the use in those
containers.

Thus, if call setUse on a use, you are *actually changing that specific use
to something*.
There is no setUser.

Besides, if the Value 'v' here is itself an Instruction, then what are its
'uses' and 'users' ??

See above