Craig Topper via llvm-dev
2021-Jun-18 02:13 UTC
[llvm-dev] When I got a Operator by iterating a Value's User, how can I got the relevant Instruction?
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/20210617/0bb2f225/attachment.html>
周书林 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>