On 29/10/2011, at 1:57 AM, Richard Guenther wrote: > > We fail to keep the cannot-inline flag up-to-date when turning > indirect to direct calls. The following patch arranges to do > this during statement folding (which should always be called > when that happens). It also makes sure to copy the updated flag > to the edge when iterating early inlining. > > Bootstrap and regtest running on x86_64-unknown-linux-gnu, ok?
The patch looks good to me, but I'm not a reviewer. A couple of notes below. > > ! /* Check whether propagating into the function address made the > ! call direct, and thus possibly non-inlineable. > ! ??? This asks for a more conservative setting of the non-inlinable > ! flag, namely true for all indirect calls. But that would require > ! that we can re-compute the flag conservatively, thus it isn't > ! ever initialized from something else than return/argument type > ! checks . */ > ! callee = gimple_call_fndecl (stmt); > ! if (callee > ! && !gimple_check_call_matching_types (stmt, callee)) > ! gimple_call_set_cannot_inline (stmt, true); Don't you need to use cgraph_function_or_thunk_node wrapper here? > Index: gcc/ipa-inline.c > =================================================================== > *** gcc/ipa-inline.c (revision 180608) > --- gcc/ipa-inline.c (working copy) > *************** early_inliner (void) > *** 1949,1954 **** > --- 1949,1956 ---- > = estimate_num_insns (edge->call_stmt, &eni_size_weights); > es->call_stmt_time > = estimate_num_insns (edge->call_stmt, &eni_time_weights); > + edge->call_stmt_cannot_inline_p > + = gimple_call_cannot_inline_p (edge->call_stmt); Wouldn't ipa_make_edge_direct or cgraph_make_edge_direct be a better place for this? Thank you, -- Maxim Kuvyrkov CodeSourcery / Mentor Graphics