Re: Turn inline_edge_summary into ipa_call_summary

2017-05-19 Thread Jan Hubicka
> 
> and way way more (C, Ada, ...).  Assuming that the ipa-predicate.[ch]
> patch was really only cosmetic, this only leaves your patch in this rev
> range.
> 
> Please fix.
Hi,
I apologize for the breakage. I already commited a fix before lunch but seems my
email did not get through.  I am attaching it.  I amanged to bundle into patch 
a local
change which turn call_stmt_size/time unsigned and confuses one comparsion in
want_inline_small_function_p.

Honza

* ipa-inline.h (ipa_call_summary): Turn sizes into signed;
add ctor.
* ipa-inline.c (want_inline_small_function_p): Do not cast to
unsigned.
Index: ipa-inline.h
===
--- ipa-inline.h(revision 248262)
+++ ipa-inline.h(working copy)
@@ -189,10 +189,18 @@ struct ipa_call_summary
   /* Vector indexed by parameters.  */
   vec param;
   /* Estimated size and time of the call statement.  */
-  unsigned int call_stmt_size;
-  unsigned int call_stmt_time;
+  int call_stmt_size;
+  int call_stmt_time;
   /* Depth of loop nest, 0 means no nesting.  */
   unsigned int loop_depth;
+  
+  /* Keep all field empty so summary dumping works during its computation.
+ This is useful for debugging.  */
+  ipa_call_summary ()
+: predicate (NULL), param (vNULL), call_stmt_size (0), call_stmt_time (0),
+  loop_depth (0)
+{
+}
 };
 
 class ipa_call_summary_t: public call_summary 
Index: ipa-inline.c
===
--- ipa-inline.c(revision 248262)
+++ ipa-inline.c(working copy)
@@ -723,7 +723,7 @@ want_inline_small_function_p (struct cgr
   && (!e->count || !e->maybe_hot_p ()))
   && inline_summaries->get (callee)->min_size
- ipa_call_summaries->get (e)->call_stmt_size
- > (unsigned)MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO))
+ > MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO))
 {
   e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
   want_inline = false;
@@ -731,7 +731,7 @@ want_inline_small_function_p (struct cgr
   else if ((DECL_DECLARED_INLINE_P (callee->decl) || e->count)
   && inline_summaries->get (callee)->min_size
- ipa_call_summaries->get (e)->call_stmt_size
- > (unsigned)16 * MAX_INLINE_INSNS_SINGLE)
+ > 16 * MAX_INLINE_INSNS_SINGLE)
 {
   e->inline_failed = (DECL_DECLARED_INLINE_P (callee->decl)
  ? CIF_MAX_INLINE_INSNS_SINGLE_LIMIT


Re: Turn inline_edge_summary into ipa_call_summary

2017-05-19 Thread Rainer Orth
Hi Jan,

> this patch makes edge summaries to use call_summary template and renames them
> as they are not inliner specific for few years.
>
> Bootstrapped/regtested x86_64-linux.
>
> Honza
>
>   * ipa-inline-analysis.c (cgraph_2edge_hook_list, cgraph_edge_hook_list,
>   inline_edge_removal_hook, inline_edge_duplication_hook): Remove.
>   (inline_edge_summary_vec): Turn into ...
>   (ipa_call_summaries): ... this one.
>   (redirect_to_unreachable, edge_set_predicate,
>   evaluate_properties_for_edge, inline_summary_alloc,
>   reset_ipa_call_summary, reset_inline_summary,
>   inline_summary_t::duplicate): Update.
>   (inline_edge_duplication_hook): Turn to ...
>   (ipa_call_summary_t::duplicate): ... this one.
>   (inline_edge_removal_hook): Turn to ...
>   (ipa_call_summary_t::remove): ... this one.
>   (dump_inline_edge_summary): Turn to ...
>   (dump_ipa_call_summary): ... this one.
>   (estimate_function_body_sizes): Update.
>   (inline_update_callee_summaries): Update.
>   (remap_edge_change_prob): Update.
>   (remap_edge_summaries): Update.
>   (inline_merge_summary): Update.
>   (do_estimate_edge_time): Update.
>   (inline_generate_summary): Update.
>   (inline_read_section): Update.
>   (inline_read_summary): Update.
>   (inline_free_summary): Update.
>   * ipa-inline.c (can_inline_edge_p): Update.
>   (compute_inlined_call_time): Update.
>   (want_inline_small_function_p): Update.
>       (edge_badness): Update.
>   (early_inliner): Update.
>   * ipa-inline.h (inline_edge_summary): Turn to ...
>   (ipa_call_summary): ... this one.
>   (ipa_call_summary_t): New class.
>   (inline_edge_summary_t, inline_edge_summary_vec): Remove.
>   (ipa_call_summaries): New.
>   (inline_edge_summary): Remove.
>   (estimate_edge_growth): Update.
>   * ipa-profile.c (ipa_propagate_frequency_1): Update.
>   * ipa-prop.c (ipa_make_edge_direct_to_target): Update.
>   * ipa-split.c (execute_split_functions): Update.
>   * ipa.c (symbol_table::remove_unreachable_nodes): Update.

between r248242 and r248262, a very large number of IPA-related
testsuite regressions occured, e.g. on x86_64-pc-linux-gnu, but also on
sparc-sun-solaris2.12:

+FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++11  scan-ipa-dump-times inline 
"Discovered a virtual call to a known target" 2
+FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++11  scan-tree-dump-times optimized 
"return 2" 3
+FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++14  scan-ipa-dump-times inline 
"Discovered a virtual call to a known target" 2
+FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++14  scan-tree-dump-times optimized 
"return 2" 3
+FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++98  scan-ipa-dump-times inline 
"Discovered a virtual call to a known target" 2
+FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++98  scan-tree-dump-times optimized 
"return 2" 3
+FAIL: g++.dg/ipa/devirt-45.C  -std=gnu++11  scan-ipa-dump-times inline 
"Discovered a virtual call to a known target[^n]*A::foo" 1
+FAIL: g++.dg/ipa/devirt-45.C  -std=gnu++14  scan-ipa-dump-times inline 
"Discovered a virtual call to a known target[^n]*A::foo" 1
+FAIL: g++.dg/ipa/devirt-45.C  -std=gnu++98  scan-ipa-dump-times inline 
"Discovered a virtual call to a known target[^n]*A::foo" 1
+FAIL: g++.dg/ipa/inline-1.C  -std=gnu++11  scan-ipa-dump-times inline 
"Considering void inline_me(" 1
+FAIL: g++.dg/ipa/inline-1.C  -std=gnu++11  scan-ipa-dump-times inline 
"Considering void inline_me_too(" 1
+FAIL: g++.dg/ipa/inline-1.C  -std=gnu++14  scan-ipa-dump-times inline 
"Considering void inline_me(" 1
+FAIL: g++.dg/ipa/inline-1.C  -std=gnu++14  scan-ipa-dump-times inline 
"Considering void inline_me_too(" 1
+FAIL: g++.dg/ipa/inline-1.C  -std=gnu++98  scan-ipa-dump-times inline 
"Considering void inline_me(" 1
+FAIL: g++.dg/ipa/inline-1.C  -std=gnu++98  scan-ipa-dump-times inline 
"Considering void inline_me_too(" 1
+FAIL: g++.dg/ipa/inline-2.C  -std=gnu++11  scan-ipa-dump-times inline 
"Considering void inline_me(" 1
+FAIL: g++.dg/ipa/inline-2.C  -std=gnu++11  scan-ipa-dump-times inline 
"Considering void inline_me_too(" 1
+FAIL: g++.dg/ipa/inline-2.C  -std=gnu++14  scan-ipa-dump-times inline 
"Considering void inline_me(" 1
+FAIL: g++.dg/ipa/inline-2.C  -std=gnu++14  scan-ipa-dump-times inline 
"Considering void inline_me_too(" 1
+FAIL: g++.dg/ipa/inline-2.C  -std=gnu++98  scan-ipa-dump-times inline 
"Considering void inline_me(" 1
+FAIL: g++.dg/ipa/inline-2.C  -std=gnu++98  scan-ipa-dump-times inline 
"Considering 

Turn inline_edge_summary into ipa_call_summary

2017-05-19 Thread Jan Hubicka
Hi,
this patch makes edge summaries to use call_summary template and renames them
as they are not inliner specific for few years.

Bootstrapped/regtested x86_64-linux.

Honza

* ipa-inline-analysis.c (cgraph_2edge_hook_list, cgraph_edge_hook_list,
inline_edge_removal_hook, inline_edge_duplication_hook): Remove.
(inline_edge_summary_vec): Turn into ...
(ipa_call_summaries): ... this one.
(redirect_to_unreachable, edge_set_predicate,
evaluate_properties_for_edge, inline_summary_alloc,
reset_ipa_call_summary, reset_inline_summary,
inline_summary_t::duplicate): Update.
(inline_edge_duplication_hook): Turn to ...
(ipa_call_summary_t::duplicate): ... this one.
(inline_edge_removal_hook): Turn to ...
(ipa_call_summary_t::remove): ... this one.
(dump_inline_edge_summary): Turn to ...
(dump_ipa_call_summary): ... this one.
(estimate_function_body_sizes): Update.
(inline_update_callee_summaries): Update.
(remap_edge_change_prob): Update.
(remap_edge_summaries): Update.
(inline_merge_summary): Update.
(do_estimate_edge_time): Update.
(inline_generate_summary): Update.
(inline_read_section): Update.
(inline_read_summary): Update.
(inline_free_summary): Update.
* ipa-inline.c (can_inline_edge_p): Update.
(compute_inlined_call_time): Update.
(want_inline_small_function_p): Update.
(edge_badness): Update.
(early_inliner): Update.
* ipa-inline.h (inline_edge_summary): Turn to ...
(ipa_call_summary): ... this one.
(ipa_call_summary_t): New class.
(inline_edge_summary_t, inline_edge_summary_vec): Remove.
(ipa_call_summaries): New.
(inline_edge_summary): Remove.
(estimate_edge_growth): Update.
* ipa-profile.c (ipa_propagate_frequency_1): Update.
* ipa-prop.c (ipa_make_edge_direct_to_target): Update.
* ipa-split.c (execute_split_functions): Update.
* ipa.c (symbol_table::remove_unreachable_nodes): Update.
Index: ipa-inline-analysis.c
===
--- ipa-inline-analysis.c   (revision 248241)
+++ ipa-inline-analysis.c   (working copy)
@@ -86,17 +86,9 @@ along with GCC; see the file COPYING3.
 #include "cfgexpand.h"
 #include "gimplify.h"
 
-/* Holders of ipa cgraph hooks: */
-static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
-static struct cgraph_edge_hook_list *edge_removal_hook_holder;
-static void inline_edge_removal_hook (struct cgraph_edge *, void *);
-static void inline_edge_duplication_hook (struct cgraph_edge *,
- struct cgraph_edge *, void *);
-
-/* VECtor holding inline summaries.  
-   In GGC memory because conditions might point to constant trees.  */
+/* Summaries.  */
 function_summary  *inline_summaries;
-vec inline_edge_summary_vec;
+call_summary  *ipa_call_summaries;
 
 /* Cached node/edge growths.  */
 vec edge_growth_cache;
@@ -254,7 +246,7 @@ redirect_to_unreachable (struct cgraph_e
 e->make_direct (target);
   else
 e->redirect_callee (target);
-  struct inline_edge_summary *es = inline_edge_summary (e);
+  struct ipa_call_summary *es = ipa_call_summaries->get (e);
   e->inline_failed = CIF_UNREACHABLE;
   e->frequency = 0;
   e->count = 0;
@@ -279,7 +271,7 @@ edge_set_predicate (struct cgraph_edge *
   && (!e->speculative || e->callee))
 e = redirect_to_unreachable (e);
 
-  struct inline_edge_summary *es = inline_edge_summary (e);
+  struct ipa_call_summary *es = ipa_call_summaries->get (e);
   if (predicate && *predicate != true)
 {
   if (!es->predicate)
@@ -457,7 +449,7 @@ evaluate_properties_for_edge (struct cgr
 {
   struct ipa_node_params *parms_info;
   struct ipa_edge_args *args = IPA_EDGE_REF (e);
-  struct inline_edge_summary *es = inline_edge_summary (e);
+  struct ipa_call_summary *es = ipa_call_summaries->get (e);
   int i, count = ipa_get_cs_argument_count (args);
 
   if (e->caller->global.inlined_to)
@@ -540,36 +532,25 @@ evaluate_properties_for_edge (struct cgr
 static void
 inline_summary_alloc (void)
 {
-  if (!edge_removal_hook_holder)
-edge_removal_hook_holder =
-  symtab->add_edge_removal_hook (_edge_removal_hook, NULL);
-  if (!edge_duplication_hook_holder)
-edge_duplication_hook_holder =
-  symtab->add_edge_duplication_hook (_edge_duplication_hook, NULL);
-
   if (!inline_summaries)
-inline_summaries = (inline_summary_t*) inline_summary_t::create_ggc 
(symtab);
-
-  if (inline_edge_summary_vec.length () <= (unsigned) symtab->edges_max_uid)
-inline_edge_summary_vec.safe_grow_cleared (symtab->edges_max_uid + 1);
+inline_summaries = inline_summary_t::create_ggc (symtab);
+