> 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 <mli...@suse.cz>
> Date: Mon, 19 Jan 2015 14:28:50 +0100
> Subject: [PATCH] Fix PR64664.
> 
> gcc/ChangeLog:
> 
> 2015-01-19  Martin Liska  <mli...@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
> 

Reply via email to