> On 12/13/2013 05:58 AM, Jan Hubicka wrote:
> >>+  if (callee->calls_comdat_local)
> >>+    to->calls_comdat_local = true;
> >>+  else if (to->calls_comdat_local && symtab_comdat_local_p (callee))
> >>+    {
> >>+      struct cgraph_edge *se = to->callees;
> >>+      for (; se; se = se->next_callee)
> >>+   if (se->inline_failed && symtab_comdat_local_p (se->callee))
> >>+     break;
> >>+      if (se == NULL)
> >>+   to->calls_comdat_local = false;
> >>+    }
> >
> >Actually this is still not quite right - when we have !inline_failed case,
> >we need to check if callee calls comdat local.
> 
> >Moreover when we turn comdat_local to false, we need to recompute also
> >function it is inlined into.
> 
> I don't see why.  If function A calls function B, which calls
> comdat-local function C, A can be inlined, so why do we need to
> recompute anything for A after we inline C into B?

The situation is whre B is inlined into A and it calls comdat
local C.  In this case both B and A have the flag set.  now
we inline C into B and we need to clean up the flag for A, too.

This can probably happen when you call the wrapper ctor from the
ctor itself?

Honza
> 
> Jason

Reply via email to