This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug middle-end/55797] [4.8 Regression] ICE: verify_cgraph_node failed: edge has no corresponding call_stmt


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

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> 2013-01-08 13:50:58 UTC ---
Eh, we do totally crazy (recursive) inlining here ...

struct section_info
{
  intrusive_ptr < section_info > parent;
};

struct file_info
{
  intrusive_ptr < file_info > parent;
  intrusive_ptr < section_info > switched_section;
};

so the simple

void
start_file (void)
{
  intrusive_ptr < file_info > parent;
}

creates and destroys the graph of file_info / section_info nodes
with the edges represented by intrusive_ptr's.

void start_file() ()
{
...
  <bb 2>:
  _5 = parent.px;
  if (_5 != 0B)
    goto <bb 3>;
  else
    goto <bb 1041> (<L3>);

  <bb 3>:
  _6 = &_5->switched_section;
  _7 = _6->px;
  if (_7 != 0B)
    goto <bb 4>;
  else
    goto <bb 6> (<L1>);

  <bb 4>:
  section_info::~section_info (_7);

  <bb 5>:
  operator delete (_7);
...
and 1000 calls follow.


I wonder why we need such high early-inlin-insns number and for lower we hit:

      else if ((n = num_calls (callee)) != 0
               && growth * (n + 1) > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
        {
          if (dump_file)
            fprintf (dump_file, "  will not early inline: %s/%i->%s/%i, "
                     "growth %i exceeds --param early-inlining-insns "
                     "divided by number of calls\n",
                     xstrdup (cgraph_node_name (e->caller)), e->caller->uid,
                     xstrdup (cgraph_node_name (callee)), callee->uid,
                     growth);
          want_inline = false;
        }

of which I cannot make very much sense.  Why should the number of calls
in callee(!) times the growth matter?  Shouldn't this be the number
of times the caller calls callee?  And why even that?  We've gone completely
away from the "consider only if all calls can be inlined" way of early
inline operation!


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]