This is the mail archive of the
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 <firstname.lastname@example.org> 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()'
rebuidl_cgraph_edges just looks at the function body and makes edges
accordingly. It is not doing eny redirection.
The way redirection is usually done is that you call cgraph_redirect_edge_callee
and redirect edge to your clone. Updating of statements is done alter, at
the end of IPA stage via cgraph_redirect_edge_call_stmt_to_callee
> Yes, my pass is really late, after all IPA passes have complete. Once
> again, thank you for your insight!
This will be probably the problem, since then the redirection is not done.
You can try to simply call cgraph_redirect_edge_call_stmt_to_callee after
each redirection. But why you need to do IPA pass so late?