Hi Martin, thanks very much for the information! On Tue, Mar 20, 2012 at 9:29 PM, Martin Jambor <mjam...@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