Hi,

On Mon, Mar 26, 2012 at 01:34:55AM +0000, Iyer, Balaji V wrote:
> Hello Everyone,
> I am currently trying to take certain functions (marked by certain
> attributes) and create vector version along with the scalar versions
> of the function. For example, let's say I have a function my_add
> that is marked with a certain attribute, I am trying to clone it
> into my_add_vector and still keep the original my_add. For this, I
> am trying to use tree_function_versioning in cgraphunit.c to clone
> the cgraph_node into a new function. Does this function actually
> create a 2nd function (called my_add_vector) and copy the body from
> my_add function to the my_add_vector function or does it just create
> a node called my_add_vector and then create a pointer to the body of
> the my_add?
> 
> Is there a better approach for doing this?
> 

tree_function_versioning indeed does copy the body of a function into
a new one, but that's the only thing it does.  You might be better
served by its callers such as cgraph_function_versioning.  But I
believe all cloning functions currently also make the new clone
private to the current compilation unit (and thus subject to
unreachable node removal if they have no callers) which is something
you might not want.  If it is a problem, you'd either need to re-set
the relevant decl and node attributes subsequently or change the
cloning functions themselves.

I assume you're not operating within an IPA pass, in that case you'd
need cgraph_create_virtual_clone and a transformation hook.

Martin

Reply via email to