[llvm-dev] When I got a Operator by iterating a Value's User, how can I got the relevant Instruction?

周书林 via llvm-dev llvm-dev at lists.llvm.org
Thu Jun 17 21:44:03 PDT 2021


Hi Craig,

I have tried to visit the Users of current GEPOperator, but the results are
not what I am looking for.
In detail, when I tried to get the Users of GEPOperator of the LoadInst,
i.e. * getelementptr inbounds (%struct.TTT, %struct.TTT* @ttt, i32 0, i32
2) *,
the results are turned out to be Users of GlobalVariable *@ttt, *i.e.
something like
*i8* bitcast (%struct.TTT* @ttt to i8*)*, or *i32* getelementptr inbounds
(%struct.TTT, %struct.TTT* @ttt, i32 0, i32 1)*.

I am not sure what happened here. Is that the def-use chain of structural
global variables always contains the whole information related to the
global variable?

Sincerely,
Shulin

Craig Topper <craig.topper at gmail.com> 于2021年6月18日周五 上午10:14写道:

> I see so you want to see where the GlobalVariable is accesssed. You should
> be able to get the Users of the ConstantExpr as well, those will either be
> another ConstantExpr or an Instruction. In your example, one of the Users
> of the GEPOperator should be the LoadInst.
>
> ~Craig
>
>
> On Thu, Jun 17, 2021 at 7:06 PM 周书林 <zhoushulin1992 at gmail.com> wrote:
>
>> Hi Craig,
>>
>> I started from GlobalVaribles, so there are situations that I met the
>> ConstantExprs, i.e. some Operators.
>>
>> Craig Topper <craig.topper at gmail.com> 于2021年6月18日周五 上午8:37写道:
>>
>>> How did you choose where you started from? An Instruction can only be
>>> used by another Instruction, but it seems you've started from a Constant
>>> which can be used by ConstantExprs.
>>>
>>> ~Craig
>>>
>>>
>>> On Thu, Jun 17, 2021 at 5:25 PM 周书林 via llvm-dev <
>>> llvm-dev at lists.llvm.org> wrote:
>>>
>>>> Hi Michael,
>>>>
>>>> Thank you very much!
>>>> I have a further question: if I want to get the dataflow of a target
>>>> Value, is there any way to handle these situations when iterate the
>>>> Users?Or only by iterator all the instructions and their operands?
>>>>
>>>> Sincerely,
>>>> Shulin
>>>>
>>>> Michael Kruse <llvmdev at meinersbur.de> 于2021年6月18日周五 上午5:11写道:
>>>>
>>>>> Am Do., 17. Juni 2021 um 10:24 Uhr schrieb 周书林 via llvm-dev
>>>>> <llvm-dev at lists.llvm.org>:
>>>>> > %39 = load i32, i32* getelementptr inbounds (%struct.TTT,
>>>>> %struct.TTT* @ttt, i32 0, i32 2), align 8, !dbg !971
>>>>>
>>>>> %39 is the LoadInst, while getelementptr is its second operand. It is
>>>>> inlined because it is an llvm::Constant, not an instruction. Constants
>>>>> do not participate in use/user-chains and hence there is no link from
>>>>> GEP to the LoadInst that is using it. The constant GEP object may be
>>>>> used by an arbitrary number of other instructions, other constants in
>>>>> the same or other functions.
>>>>>
>>>>> Node that there "GEPOperator" can represent either a GetElementPtrInst
>>>>> (i.e. an instruction) or a GEP constant expression (derived from
>>>>> ConstantExpr)
>>>>>
>>>>> Michael
>>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210618/0d8fe7bc/attachment.html>


More information about the llvm-dev mailing list