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.

Hi Dounia,

> 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

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

Yep.

And it should work for any kind of argument – they’re always SSA values.

Yes, I tried it and it worked perfectly (But I am still surprised use-def chains is not interprocedural by default)

Thanks for your help,
Dounia

As most optimizers are not interprocedural, this would largely slow down the compiler.

For this, we could consider compiler options such as -enable-ipa or - fdisable-ipa,…

I am afraid people are not developing interprocedural optimizers because underlying analyses are not :wink: