http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55264



Aldy Hernandez <aldyh at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

                 CC|                            |jakub at gcc dot gnu.org,

                   |                            |jason at gcc dot gnu.org



--- Comment #3 from Aldy Hernandez <aldyh at gcc dot gnu.org> 2012-11-27 
15:34:06 UTC ---

When compiled with -fno-weak, we re-use the out-of-line copy in

clone_inlined_nodes(), around here:



 /* We may eliminate the need for out-of-line copy to be output.

     In that case just go ahead and re-use it.  This is not just an

     memory optimization.  Making offline copy of fuction disappear

     from the program will improve future decisions on inlining.  */



This happens because the conditional can_remove_node_now_p_1() returns true for

virtuals that are not weak:



      /* Inlining might enable more devirtualizing, so we want to remove

         those only after all devirtualizable virtual calls are processed.

         Lacking may edges in callgraph we just preserve them post

         inlining.  */

      && (!DECL_VIRTUAL_P (node->symbol.decl)

          || (!DECL_COMDAT (node->symbol.decl)

          && !DECL_EXTERNAL (node->symbol.decl)))



When we re-use the out-of-line copy in clone_inlined_nodes(), we end up setting

inlined_to here:



    e->callee->global.inlined_to = e->caller;



This causes the ICE in ipa_make_edge_direct_to_target, because inlined_to is

non-NULL:



  /* We can not make edges to inline clones.  It is bug that someone removed

     the cgraph node too early.  */

  gcc_assert (!callee->global.inlined_to);



Any tips on how to proceed from here?

Reply via email to