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

Martin Jambor <jamborm at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hubicka at gcc dot gnu.org

--- Comment #3 from Martin Jambor <jamborm at gcc dot gnu.org> 2011-04-13 
14:55:48 UTC ---
Compilation segfaults in LTRANS stage on line 1738 in tree-inline.c
(the assert below) because the dereferenced dest is zero.

      /* Constant propagation on argument done during inlining
     may create new direct call.  Produce an edge for it.  */
      if ((!edge
       || (edge->indirect_inlining_edge
           && id->transform_call_graph_edges == CB_CGE_MOVE_CLONES))
      && (fn = gimple_call_fndecl (stmt)) != NULL)
    {
      struct cgraph_node *dest = cgraph_get_node (fn);

      /* We have missing edge in the callgraph.  This can happen
         when previous inlining turned an indirect call into a
         direct call by constant propagating arguments or we are
         producing dead clone (for further cloning).  In all
         other cases we hit a bug (incorrect node sharing is the
         most common reason for missing edges).  */
      gcc_assert (dest->needed || !dest->analyzed
              || dest->address_taken
                || !id->src_node->analyzed
              || !id->dst_node->analyzed);

fn is <function_decl 0x7ffff65d3300 __comp_dtor> 
id->transform_call_graph_edges is CB_CGE_MOVE_CLONES
calling cgraph_edge (id->dst_node, stmt) from within the debugger
(to get edge which it says is optimized out) returns NULL.

I'd rather avoid calling cgraph_get_create_node here, the node should
be created by whatever inserts it into the IL.  Let me check whether
the bug goes away if I disable IPA-CP first.

Reply via email to