On Thu, Nov 13, 2014 at 12:11:08AM +0100, Jan Hubicka wrote:
> > + else if (gimple_call_internal_p (call) && !nonfreeing_call_p (call))
> > + local->can_free = true;
>
> Actually I think you want to do this for can_throw, too.
> We probably do not have throwing internal calls, but it is better to be safe.
The only border case internal function is ABNORMAL_DISPATCHER, the only
internal function right now that is not ECF_LEAF. It doesn't throw, but is
used for sjlj EH.
That said, I don't see any special handling of if (callee_t) for can_throw
(for internal functions it will be always false), only for
looping/pure_const_state, but that seems to be only about doing something
for selected functions (builtin or specially named - setjmp*).
Or do you mean pretend that callee_t is non-NULL for internal functions?
> > +/* Produce transitive closure over the callgraph and compute can_free
> > + attributes. */
> > +
> > +static void
> > +propagate_can_free (void)
> > +{
> > + struct cgraph_node *node;
> > + struct cgraph_node *w;
> > + struct cgraph_node **order
> > + = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
> > + int order_pos;
> > + int i;
> > + struct ipa_dfs_info *w_info;
> > +
> > + order_pos = ipa_reduced_postorder (order, true, false, NULL);
> > + if (dump_file)
> > + {
> > + cgraph_node::dump_cgraph (dump_file);
> > + ipa_print_order (dump_file, "reduced", order, order_pos);
> > + }
>
> The propagation seems fine, but I wonder if we won't get better memory
> locality doing this
> during the propagation of pure/const?
Ok, will try to put it there.
Jakub