From 90190bb3ccf6809fc742f6d29459f4d30ef420e5 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 19 Jan 2015 19:07:08 +0100 Subject: [PATCH] re PR ipa/64664 (ICE: tree check: expected function_decl, have in opts_for_fn, at tree.h:4706) Fix PR64664. PR ipa/64664 * ipa-icf.c (sem_item_optimizer::filter_removed_items): Handle safe potentially removed nodes during filtering. From-SVN: r219853 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-icf.c | 47 +++++++++++++++++++---------------------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 48341c53e1c..ac1e45935c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-01-19 Martin Liska + + PR ipa/64664 + * ipa-icf.c (sem_item_optimizer::filter_removed_items): + Handle safe potentially removed nodes during filtering. + 2015-01-19 Martin Liska * doc/extend.texi (no_icf): Add new attribute description. diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index a91fd98b807..afb5be5097c 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 (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.30.2