周书林 via llvm-dev
2021-Jun-18 04:44 UTC
[llvm-dev] When I got a Operator by iterating a Value's User, how can I got the relevant Instruction?
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>
Craig Topper via llvm-dev
2021-Jun-18 04:55 UTC
[llvm-dev] When I got a Operator by iterating a Value's User, how can I got the relevant Instruction?
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>