This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Cloning functions
Hi Martin, thanks very much for the information!
On Tue, Mar 20, 2012 at 9:29 PM, Martin Jambor <mjambor@suse.cz> wrote:
> Hi,
>
> On Tue, Mar 20, 2012 at 02:07:17PM +1100, Matt Davis wrote:
>> Hello,
>> In my transformation of an input program, I need to clone functions
>> and the callee functions in each clone. ÂTo clone a function, or
>> create a duplicate, I use "cgraph_function_versioning()" ÂThis works
>> perfectly well for the parent function. ÂI then go through the
>> statements in the parent and look for any function calls (callees).
>> If I find a function call, I clone that function and update the call
>> site using "gimple_call_set_fn()" ÂNow, when I dump the gimple via
>> "debug_function()" I see everything as I expect (parent-clone calls
>> all the callee-clones). ÂThe parent and all of its callees are the
>> clones I want. ÂHowever, when GCC finishes compiling things, the
>> callee clones are no where to be found.
>
> And do you change the calls in the callers of the "parent function?"
> This is exactly what you would see if you don't. ÂSee convert_callers
> and convert_callers_for_node in tree-sra.c (ipa_modify_call_arguments
> is probably equivalent to gimple_call_set_fndecl for your purposes).
Actually, I do change the calls in the parent function. What I had to
do was set the 'cfun' to the parent function, and then run
'rebuild_cgraph_edges()' and 'cleanup_tree_cfg()'
> cgraph_function_versioning only updates the call graph edges, not the
> associated statements which are key in non-IPA stages of compilation
> (yes, that makes the redirect_callers parameter quite misleading and
> semi-irrelevant but well...).
>
>> And the original (non-clone)
>> calleess are being used. ÂThe parent-clone is there but all of the
>> callsites are using the original callees and not the clones. ÂI know
>> there must be some update routine, (rebuild_cgraph_edges() did not
>> help) to glue the callee clones in place so that they do not revert
>> back to the original callee.
>>
>> I hope I haven't been too confusing, I do appreciate any help if possible.
>
> I am confused by the term parent function. ÂDo you mean a parent of
> nested functions or something else?
Yep, you got it.
> If so, at what stage of
> compilation do you clone functions then? ÂI'm afraid that
> cgraph_function_lowering was not written with un-lowered nested
> functions in mind and is only usable once they are lowered (because I
> just had a quick look and the relevant cgraph_node fields are not
> dealt with). ÂBut at the same time I think it is unlikely your pass
> runs that early.
Yes, my pass is really late, after all IPA passes have complete. Once
again, thank you for your insight!
-Matt