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

Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Thu Jun 17 21:55:41 PDT 2021


Can you share your code?

On Thu, Jun 17, 2021 at 9:44 PM 周书林 <zhoushulin1992 at gmail.com> wrote:

> 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
>>>>>
>>>> --
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210617/40ef6b41/attachment.html>


More information about the llvm-dev mailing list