This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR64664
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Martin Liška <mliska at suse dot cz>
- Cc: "gcc-pat >> GCC Patches" <gcc-patches at gcc dot gnu dot org>, "hubicka@ >> Jan Hubicka" <hubicka at ucw dot cz>
- Date: Mon, 19 Jan 2015 18:43:38 +0100
- Subject: Re: [PATCH] Fix PR64664
- Authentication-results: sourceware.org; auth=none
- References: <54BD282F dot 3030902 at suse dot cz>
> 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
>