Dounia Khaldi via llvm-dev
2016-Jul-26 21:41 UTC
[llvm-dev] [LLVMdev] Interprocedural use-def chains
Hello, I have been using the USE class to access the use-def chains of different values. However, what I have noticed is that the set of users of a particular value is limited for the appearance of that variable in the current function. How can I get the interprocedural use of a particular value? For example, if a variable *a* is used as an argument in a function call *foo*, the USE analysis would go to the definition of* foo*, and get me the users of that argument in the called function as well. Currently, what USE does is that it returns the call as a use and stops there. Any information or ideas would be appreciated. -- Dounia KHALDI Research Assistant Professor Institute for Advanced Computational Science Stony Brook University Stony Brook, NY 11794-5250 www.iacs.stonybrook.edu -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160726/40900586/attachment.html>
Sanjoy Das via llvm-dev
2016-Jul-26 21:51 UTC
[llvm-dev] [LLVMdev] Interprocedural use-def chains
Hi Dounia, Dounia Khaldi via llvm-dev wrote: > I have been using the USE class to access the use-def chains of > different values. However, what I have noticed is that the set of users > of a particular value is limited for the appearance of that variable in > the current function. > > How can I get the interprocedural use of a particular value? For > example, if a variable /a/ is used as an argument in a function call > /foo/, the USE analysis would go to the definition of/foo/, and get me > the users of that argument in the called function as well. Currently, > what USE does is that it returns the call as a use and stops there. Why not just recurse to uses of the corresponding llvm::Argument instance? Is there a reason why you're avoiding that? This won't work for varargs, but that's a difficult problem anyway. Specifically, I'm saying: if (user is CallInst or InvokeInst) { unsigned ArgNo = // Get argument no. of Use & if (auto *F = getCallTargetIfPossible()) { pushToWorklist(F->getArgument(ArgNo)->users()); // Or recurse } } -- Sanjoy
Dounia Khaldi via llvm-dev
2016-Jul-26 22:05 UTC
[llvm-dev] [LLVMdev] Interprocedural use-def chains
Thanks for your reply. Yes, I was about to recurse over the use list of the argument in the called function. I did not want to pursue that because with this solution, I am going to implement the interprocedural part myself and was wondering if that was not already done. I was not also 100% sure that this will work for any type of arguments. If, based on your response, this is my only solution then I will go for it. Thanks, Dounia On Tue, Jul 26, 2016 at 5:51 PM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote:> Hi Dounia, > > Dounia Khaldi via llvm-dev wrote: > > I have been using the USE class to access the use-def chains of > > different values. However, what I have noticed is that the set of users > > of a particular value is limited for the appearance of that variable in > > the current function. > > > > How can I get the interprocedural use of a particular value? For > > example, if a variable /a/ is used as an argument in a function call > > /foo/, the USE analysis would go to the definition of/foo/, and get me > > the users of that argument in the called function as well. Currently, > > what USE does is that it returns the call as a use and stops there. > > Why not just recurse to uses of the corresponding llvm::Argument > instance? Is there a reason why you're avoiding that? This won't > work for varargs, but that's a difficult problem anyway. > > Specifically, I'm saying: > > if (user is CallInst or InvokeInst) { > unsigned ArgNo = // Get argument no. of Use & > if (auto *F = getCallTargetIfPossible()) { > pushToWorklist(F->getArgument(ArgNo)->users()); // Or recurse > } > } > > -- Sanjoy >-- Dounia KHALDI Research Assistant Professor Institute for Advanced Computational Science Stony Brook University Stony Brook, NY 11794-5250 www.iacs.stonybrook.edu -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160726/e33544a2/attachment.html>