This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: cgraph callees availability


On 01/07/11 10:31, Richard Guenther wrote:

It is being done because the edges are not kept up-to-date. There is no other way to find callees but to walk all statements. I also do not see a good reason why you would want to use the number of callees of a function to decide whether to emit sibcalls from it.


Thanks for the input Richard. Makes sense. One way which seems to work is to obviously add a pass to rebuild the cgraph edges before pass_expand and remove them afterwards.


The reason why I need them is that I need know if a given register is live. I can check this when I expand_epilogue but not during expand (because RA has not been done). This special register is used for the return address of a function. So, if it is live it tells me that there was another function call besides the sibcall. If there was, it means I have to emit some extra instructions to do the sibcall. However, if I have to emit extra instructions then I don't actually want to do the sibcall cause I will be adding to the resulting size of the function which goes against our backend port policy.

By checking if there is more than 1 callee (an extra function called besides the sibcall) then I will know if I will need extra instructions or not and if I do, I say the function is _not_ ok for sibcall.

I guess if I don't want to add the extra passes before and after pass expand then I have to walk the statements. Sounds like it's the cleaner solution if I don't want to mess with the core.

Cheers,
--
PMatos


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]