diff mbox

Fix PR64664

Message ID 54BD282F.3030902@suse.cz
State New
Headers show

Commit Message

Martin Liška Jan. 19, 2015, 3:52 p.m. UTC
Hello.

Following patch correctly handles filtered removed items, where we forgot
to check that a cgraph node is deleted or not. Apart from that, logic
in the function was rewritten and is much more understandable what's going on.

Tested on x86_64-linux-pc.
Ready for installation?

Thanks,
Martin

Comments

Jan Hubicka Jan. 19, 2015, 5:43 p.m. UTC | #1
> Hello.
> 
> Following patch correctly handles filtered removed items, where we forgot
> to check that a cgraph node is deleted or not. Apart from that, logic
> in the function was rewritten and is much more understandable what's going on.
> 
> Tested on x86_64-linux-pc.
> Ready for installation?
> 
> Thanks,
> Martin

> >From 3f1d52424d01e7a76b127bf91bdaa04077371d30 Mon Sep 17 00:00:00 2001
> From: mliska <mliska@suse.cz>
> Date: Mon, 19 Jan 2015 14:28:50 +0100
> Subject: [PATCH] Fix PR64664.
> 
> gcc/ChangeLog:
> 
> 2015-01-19  Martin Liska  <mliska@suse.cz>
> 
> 	* ipa-icf.c (sem_item_optimizer::filter_removed_items):
> 	Handle safe potentially removed nodes during filtering.
OK,
thanks

Honza
> ---
>  gcc/ipa-icf.c | 47 +++++++++++++++++++----------------------------
>  1 file changed, 19 insertions(+), 28 deletions(-)
> 
> diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
> index 0ac01a9..449d552 100644
> --- a/gcc/ipa-icf.c
> +++ b/gcc/ipa-icf.c
> @@ -1652,40 +1652,31 @@ sem_item_optimizer::filter_removed_items (void)
>      {
>        sem_item *item = m_items[i];
>  
> -      if (item->type == FUNC
> -	  && !opt_for_fn (item->decl, flag_ipa_icf_functions))
> -	{
> -	  remove_item (item);
> -	  continue;
> -	}
> -
> -      if (!flag_ipa_icf_variables && item->type == VAR)
> -	{
> +      if (m_removed_items_set.contains (item->node))
> +        {
>  	  remove_item (item);
>  	  continue;
> -	}
> -
> -      bool no_body_function = false;
> +        }
>  
>        if (item->type == FUNC)
> -	{
> +        {
>  	  cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
>  
> -	  no_body_function = in_lto_p && (cnode->alias || cnode->body_removed);
> -	}
> -
> -      if(!m_removed_items_set.contains (m_items[i]->node)
> -	  && !no_body_function)
> -	{
> -	  if (item->type == VAR || (!DECL_CXX_CONSTRUCTOR_P (item->decl)
> -				    && !DECL_CXX_DESTRUCTOR_P (item->decl)))
> -	    {
> -	      filtered.safe_push (m_items[i]);
> -	      continue;
> -	    }
> -	}
> -
> -      remove_item (item);
> +	  bool no_body_function = in_lto_p && (cnode->alias || cnode->body_removed);
> +	  if (no_body_function || !opt_for_fn (item->decl, flag_ipa_icf_functions)
> +	      || DECL_CXX_CONSTRUCTOR_P (item->decl)
> +	      || DECL_CXX_DESTRUCTOR_P (item->decl))
> +	    remove_item (item);
> +	  else
> +	    filtered.safe_push (item);
> +        }
> +      else /* VAR.  */
> +        {
> +	  if (!flag_ipa_icf_variables)
> +	    remove_item (item);
> +	  else
> +	    filtered.safe_push (item);
> +        }
>      }
>  
>    /* Clean-up of released semantic items.  */
> -- 
> 2.1.2
>
diff mbox

Patch

From 3f1d52424d01e7a76b127bf91bdaa04077371d30 Mon Sep 17 00:00:00 2001
From: mliska <mliska@suse.cz>
Date: Mon, 19 Jan 2015 14:28:50 +0100
Subject: [PATCH] Fix PR64664.

gcc/ChangeLog:

2015-01-19  Martin Liska  <mliska@suse.cz>

	* ipa-icf.c (sem_item_optimizer::filter_removed_items):
	Handle safe potentially removed nodes during filtering.
---
 gcc/ipa-icf.c | 47 +++++++++++++++++++----------------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index 0ac01a9..449d552 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -1652,40 +1652,31 @@  sem_item_optimizer::filter_removed_items (void)
     {
       sem_item *item = m_items[i];
 
-      if (item->type == FUNC
-	  && !opt_for_fn (item->decl, flag_ipa_icf_functions))
-	{
-	  remove_item (item);
-	  continue;
-	}
-
-      if (!flag_ipa_icf_variables && item->type == VAR)
-	{
+      if (m_removed_items_set.contains (item->node))
+        {
 	  remove_item (item);
 	  continue;
-	}
-
-      bool no_body_function = false;
+        }
 
       if (item->type == FUNC)
-	{
+        {
 	  cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
 
-	  no_body_function = in_lto_p && (cnode->alias || cnode->body_removed);
-	}
-
-      if(!m_removed_items_set.contains (m_items[i]->node)
-	  && !no_body_function)
-	{
-	  if (item->type == VAR || (!DECL_CXX_CONSTRUCTOR_P (item->decl)
-				    && !DECL_CXX_DESTRUCTOR_P (item->decl)))
-	    {
-	      filtered.safe_push (m_items[i]);
-	      continue;
-	    }
-	}
-
-      remove_item (item);
+	  bool no_body_function = in_lto_p && (cnode->alias || cnode->body_removed);
+	  if (no_body_function || !opt_for_fn (item->decl, flag_ipa_icf_functions)
+	      || DECL_CXX_CONSTRUCTOR_P (item->decl)
+	      || DECL_CXX_DESTRUCTOR_P (item->decl))
+	    remove_item (item);
+	  else
+	    filtered.safe_push (item);
+        }
+      else /* VAR.  */
+        {
+	  if (!flag_ipa_icf_variables)
+	    remove_item (item);
+	  else
+	    filtered.safe_push (item);
+        }
     }
 
   /* Clean-up of released semantic items.  */
-- 
2.1.2