Patchwork Inline hints

login
register
mail settings
Submitter Martin Jambor
Date Aug. 29, 2012, 12:18 p.m.
Message ID <20120829121826.GA3395@virgil.arch.suse.de>
Download mbox | patch
Permalink /patch/180699/
State New
Headers show

Comments

Martin Jambor - Aug. 29, 2012, 12:18 p.m.
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  <mjambor@suse.cz>

	* ipa-inline.h (estimate_edge_hints): Call do_estimate_edge_hints, not
	do_estimate_edge_time.

Patch

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;
 }