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