diff mbox

Fix for PR ipa/65245

Message ID 54F23BAD.2010304@suse.cz
State New
Headers show

Commit Message

Martin Liška Feb. 28, 2015, 10:05 p.m. UTC
Hello.

Following patch skips all variable aliases as potential merge candidates. Tested on x86_64-linux.

Ready for trunk?
Thanks,
Martin

Comments

Jan Hubicka Feb. 28, 2015, 10:41 p.m. UTC | #1
> Hello.
> 
> Following patch skips all variable aliases as potential merge candidates. Tested on x86_64-linux.
> 
> Ready for trunk?
> Thanks,
> Martin

> >From fbde2e98f98a71105d18cf3e91e8032d0c657139 Mon Sep 17 00:00:00 2001
> From: mliska <mliska@suse.cz>
> Date: Fri, 27 Feb 2015 22:42:49 +0100
> Subject: [PATCH 2/4] ICF: Do not consider variable aliases for merge
>  operation.
> 
> gcc/ChangeLog:
> 
> 2015-02-28  Martin Liska  <mliska@suse.cz>
> 	    Jan Hubicka   <hubicka@ucw.cz>
> 
> 	PR ipa/65245
> 	* ipa-icf.c (sem_function::parse): Do not consider aliases.
> 	(sem_variable::parse):  Likewise.
> 	(sem_item_optimizer::build_graph): Consider ultimate aliases
> 	for references.

OK, can you please add a testcase checking that two functions get merged even
if each of them referrs different alias of an equvalent symbols?

Honza
> ---
>  gcc/ipa-icf.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
> index 92133fc..864a5d0 100644
> --- a/gcc/ipa-icf.c
> +++ b/gcc/ipa-icf.c
> @@ -1095,7 +1095,7 @@ sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
>    tree fndecl = node->decl;
>    function *func = DECL_STRUCT_FUNCTION (fndecl);
>  
> -  /* TODO: add support for thunks and aliases.  */
> +  /* TODO: add support for thunks.  */
>  
>    if (!func || !node->has_gimple_body_p ())
>      return NULL;
> @@ -1407,6 +1407,9 @@ sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
>  {
>    tree decl = node->decl;
>  
> +  if (node->alias)
> +    return NULL;
> +
>    bool readonly = TYPE_P (decl) ? TYPE_READONLY (decl) : TREE_READONLY (decl);
>    if (!readonly)
>      return NULL;
> @@ -2057,7 +2060,8 @@ sem_item_optimizer::build_graph (void)
>  	  cgraph_edge *e = cnode->callees;
>  	  while (e)
>  	    {
> -	      sem_item **slot = m_symtab_node_map.get (e->callee);
> +	      sem_item **slot = m_symtab_node_map.get
> +		(e->callee->ultimate_alias_target ());
>  	      if (slot)
>  		item->add_reference (*slot);
>  
> @@ -2068,7 +2072,8 @@ sem_item_optimizer::build_graph (void)
>        ipa_ref *ref = NULL;
>        for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
>  	{
> -	  sem_item **slot = m_symtab_node_map.get (ref->referred);
> +	  sem_item **slot = m_symtab_node_map.get
> +	    (ref->referred->ultimate_alias_target ());
>  	  if (slot)
>  	    item->add_reference (*slot);
>  	}
> -- 
> 2.1.2
>
diff mbox

Patch

From fbde2e98f98a71105d18cf3e91e8032d0c657139 Mon Sep 17 00:00:00 2001
From: mliska <mliska@suse.cz>
Date: Fri, 27 Feb 2015 22:42:49 +0100
Subject: [PATCH 2/4] ICF: Do not consider variable aliases for merge
 operation.

gcc/ChangeLog:

2015-02-28  Martin Liska  <mliska@suse.cz>
	    Jan Hubicka   <hubicka@ucw.cz>

	PR ipa/65245
	* ipa-icf.c (sem_function::parse): Do not consider aliases.
	(sem_variable::parse):  Likewise.
	(sem_item_optimizer::build_graph): Consider ultimate aliases
	for references.
---
 gcc/ipa-icf.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index 92133fc..864a5d0 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -1095,7 +1095,7 @@  sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
   tree fndecl = node->decl;
   function *func = DECL_STRUCT_FUNCTION (fndecl);
 
-  /* TODO: add support for thunks and aliases.  */
+  /* TODO: add support for thunks.  */
 
   if (!func || !node->has_gimple_body_p ())
     return NULL;
@@ -1407,6 +1407,9 @@  sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
 {
   tree decl = node->decl;
 
+  if (node->alias)
+    return NULL;
+
   bool readonly = TYPE_P (decl) ? TYPE_READONLY (decl) : TREE_READONLY (decl);
   if (!readonly)
     return NULL;
@@ -2057,7 +2060,8 @@  sem_item_optimizer::build_graph (void)
 	  cgraph_edge *e = cnode->callees;
 	  while (e)
 	    {
-	      sem_item **slot = m_symtab_node_map.get (e->callee);
+	      sem_item **slot = m_symtab_node_map.get
+		(e->callee->ultimate_alias_target ());
 	      if (slot)
 		item->add_reference (*slot);
 
@@ -2068,7 +2072,8 @@  sem_item_optimizer::build_graph (void)
       ipa_ref *ref = NULL;
       for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
 	{
-	  sem_item **slot = m_symtab_node_map.get (ref->referred);
+	  sem_item **slot = m_symtab_node_map.get
+	    (ref->referred->ultimate_alias_target ());
 	  if (slot)
 	    item->add_reference (*slot);
 	}
-- 
2.1.2