re PR ipa/64664 (ICE: tree check: expected function_decl, have <invalid tree code...
authorMartin Liska <mliska@suse.cz>
Mon, 19 Jan 2015 18:07:08 +0000 (19:07 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 19 Jan 2015 18:07:08 +0000 (18:07 +0000)
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
gcc/ipa-icf.c

index 48341c53e1c4efaa3f1d5e62ebb2e18a3d34ac53..ac1e45935c565a24d304e740d4a81f463a664c69 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-19  Martin Liska  <mliska@suse.cz>
+
+       PR ipa/64664
+       * ipa-icf.c (sem_item_optimizer::filter_removed_items):
+       Handle safe potentially removed nodes during filtering.
+
 2015-01-19  Martin Liska  <mliska@suse.cz>
 
        * doc/extend.texi (no_icf): Add new attribute description.
index a91fd98b807784d7449943f09c5419879e3a2a73..afb5be5097c6a2853d3a53fda92ec55b17ff199d 100644 (file)
@@ -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.  */