This is the mail archive of the
mailing list for the GCC project.
Re: Cloning functions
On Tue, Mar 20, 2012 at 02:07:17PM +1100, Matt Davis wrote:
> 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).
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? 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.