Hi, On Tue, Aug 28, 2012 at 06:05:27PM +0200, Jan Hubicka wrote: > > On Sun, Aug 19, 2012 at 07:43:45AM +0200, Jan Hubicka wrote: > > > > > > * gcc.dg/ipa/iinline-1.c: Update testcase to test inline hints. > > > > > > * ipa-inline.c (want_inline_small_function_p): Bypass > > > inline limits for hinted functions. > > > (edge_badness): Dump hints; decrease badness for hinted funcitons. > > > * ipa-inline.h (enum inline_hints_vals): New enum. > > > (inline_hints): New type. > > > (edge_growth_cache_entry): Add hints. > > > (dump_inline_summary): Update. > > > (dump_inline_hints): Declare. > > > (do_estimate_edge_hints): Declare. > > > (estimate_edge_hints): New inline function. > > > (reset_edge_growth_cache): Update. > > > * predict.c (cgraph_maybe_hot_edge_p): Do not ice on indirect edges. > > > * ipa-inline-analysis.c (dump_inline_hints): New function. > > > (estimate_edge_devirt_benefit): Return true when function should be > > > hinted. > > > (estimate_calls_size_and_time): New hints argument; set it when > > > devritualization happens. > > > (estimate_node_size_and_time): New hints argument. > > > (do_estimate_edge_time): Cache hints. > > > (do_estimate_edge_growth): Update. > > > (do_estimate_edge_hints): New function > > > > ... > > > > > Index: ipa-inline.h > > > =================================================================== > > > *** ipa-inline.h (revision 190508) > > > --- ipa-inline.h (working copy) > > > *************** typedef struct GTY(()) condition > > > *** 42,47 **** > > > --- 42,54 ---- > > > unsigned by_ref : 1; > > > } condition; > > > > > > + /* Inline hints are reasons why inline heuristics should preffer > > > inlining given function. > > > + They are represtented as bitmap of the following values. */ > > > + enum inline_hints_vals { > > > + INLINE_HINT_indirect_call = 1 > > > + }; > > > + typedef int inline_hints; > > > + > > > DEF_VEC_O (condition); > > > DEF_VEC_ALLOC_O (condition, gc); > > > > > > *************** extern VEC(inline_edge_summary_t,heap) * > > > *** 158,163 **** > > > --- 165,171 ---- > > > typedef struct edge_growth_cache_entry > > > { > > > int time, size; > > > + inline_hints hints; > > > } edge_growth_cache_entry; > > > DEF_VEC_O(edge_growth_cache_entry); > > > DEF_VEC_ALLOC_O(edge_growth_cache_entry,heap); > > > *************** extern VEC(edge_growth_cache_entry,heap) > > > *** 168,174 **** > > > /* In ipa-inline-analysis.c */ > > > void debug_inline_summary (struct cgraph_node *); > > > void dump_inline_summaries (FILE *f); > > > ! void dump_inline_summary (FILE * f, struct cgraph_node *node); > > > void inline_generate_summary (void); > > > void inline_read_summary (void); > > > void inline_write_summary (void); > > > --- 176,183 ---- > > > /* In ipa-inline-analysis.c */ > > > void debug_inline_summary (struct cgraph_node *); > > > void dump_inline_summaries (FILE *f); > > > ! void dump_inline_summary (FILE *f, struct cgraph_node *node); > > > ! void dump_inline_hints (FILE *f, inline_hints); > > > void inline_generate_summary (void); > > > void inline_read_summary (void); > > > void inline_write_summary (void); > > > *************** void inline_merge_summary (struct cgraph > > > *** 185,190 **** > > > --- 194,200 ---- > > > void inline_update_overall_summary (struct cgraph_node *node); > > > int do_estimate_edge_growth (struct cgraph_edge *edge); > > > int do_estimate_edge_time (struct cgraph_edge *edge); > > > + inline_hints do_estimate_edge_hints (struct cgraph_edge *edge); > > > void initialize_growth_caches (void); > > > void free_growth_caches (void); > > > void compute_inline_parameters (struct cgraph_node *, bool); > > > *************** estimate_edge_time (struct cgraph_edge * > > > *** 257,262 **** > > > --- 267,288 ---- > > > } > > > > > > > > > + /* Return estimated callee runtime increase after inlning > > > + EDGE. */ > > > + > > > + static inline inline_hints > > > + estimate_edge_hints (struct cgraph_edge *edge) > > > + { > > > + inline_hints ret; > > > + if ((int)VEC_length (edge_growth_cache_entry, edge_growth_cache) <= > > > edge->uid > > > + || !(ret = VEC_index (edge_growth_cache_entry, > > > + edge_growth_cache, > > > + edge->uid).hints)) > > > + return do_estimate_edge_time (edge); > > > > Surely this was supposed to be do_estimate_edge_hints instead? > Oops, surely. It is harmless, since we always query time first and thus > populate the cache, but it ought to be fixed. > Can you please apply the obvious patch? Chinese internet is bit restrictive > and it is hard to find SSH access.. > Honza
I have committed the following (after it passed bootstrap and testing along with another patch on x86_64-linux). Martin 2012-08-29 Martin Jambor <mjam...@suse.cz> * ipa-inline.h (estimate_edge_hints): Call do_estimate_edge_hints, not do_estimate_edge_time. Index: src/gcc/ipa-inline.h =================================================================== --- src.orig/gcc/ipa-inline.h +++ src/gcc/ipa-inline.h @@ -283,7 +283,7 @@ estimate_edge_hints (struct cgraph_edge || !(ret = VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid).hints)) - return do_estimate_edge_time (edge); + return do_estimate_edge_hints (edge); return ret - 1; }