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: 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()'

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?

Honza
> 
> -Matt


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