Re: Question about Tree_function_versioning

2012-03-26 Thread Martin Jambor
Hi,

On Mon, Mar 26, 2012 at 01:34:55AM +, 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


RE: Question about Tree_function_versioning

2012-03-26 Thread Iyer, Balaji V
I have another question along the same lines. Is it possible to tell gcc to 
never delete a certain function even if it is never called in the executable?

Any help is greatly appreciated!

Thanks,

Balaji V. Iyer.

-Original Message-
From: Martin Jambor [mailto:mjam...@suse.cz] 
Sent: Monday, March 26, 2012 8:52 AM
To: Iyer, Balaji V
Cc: 'gcc@gcc.gnu.org'
Subject: Re: Question about Tree_function_versioning

Hi,

On Mon, Mar 26, 2012 at 01:34:55AM +, 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


RE: Question about Tree_function_versioning

2012-03-26 Thread Oleg Endo
On Mon, 2012-03-26 at 22:51 +, Iyer, Balaji V wrote:
 I have another question along the same lines. Is it possible to tell
 gcc to never delete a certain function even if it is never called in
 the executable?
 

__attribute__ ((used)) maybe?

Cheers,
Oleg