cgraphclones.c (cgraph_node::create_version_clone): Do not duplicate summaries.
authorJan Hubicka <jh@suse.cz>
Mon, 4 Nov 2019 14:07:09 +0000 (15:07 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 4 Nov 2019 14:07:09 +0000 (14:07 +0000)
* cgraphclones.c (cgraph_node::create_version_clone): Do not
duplicate summaries.
* ipa-fnsummary.c (ipa_fn_summary_alloc): Allocate size summary
first.
(ipa_fn_summary_t::duplicate): Use get instead of get_create to
access call summaries.
(dump_ipa_call_summary): Be ready for missing edge summaries.
(analyze_function_body): Use get instead of get_create to access
edge summary.
(estimate_calls_size_and_time): Do not access summaries of
inlined edges; sanity check they are missing.
(ipa_call_context::estimate_size_and_time): Use get instead
of get_create to access node summary.
(inline_update_callee_summaries): Do not update depth of
inlined edge.
(ipa_merge_fn_summary_after_inlining): Remove inline edge from
growth caches.
(ipa_merge_fn_summary_after_inlining): Use get instead
of get_create.
* ipa-fnsummary.h (ipa_remove_from_growth_caches): Declare.
* ipa-inline-analyssi.c (edge_growth_cache): Turn to
fast summary.
(initialize_growth_caches): Update.
(do_estimate_edge_time): Remove redundant copy of context.
(ipa_remove_from_growth_caches): New function.
* ipa-inline.c (flatten_function): Update overall summary
only when optimizing.
(inline_to_all_callers): Update overall summary of function
inlined to.
* ipa-inline.h (edge_growth_cache): Turn to fast summary.
* symbol-summary.h (call_summary_base): Set m_initialize_when_cloning
to false.

From-SVN: r277780

gcc/ChangeLog
gcc/cgraphclones.c
gcc/ipa-fnsummary.c
gcc/ipa-fnsummary.h
gcc/ipa-inline-analysis.c
gcc/ipa-inline.c
gcc/ipa-inline.h
gcc/symbol-summary.h

index b53c793d6c20ab71fda6e176b60f4a3e39b63125..a9222a8deafeebf77326c3428882e29327e5e5d8 100644 (file)
@@ -1,3 +1,38 @@
+2019-11-04  Jan Hubicka  <jh@suse.cz>
+
+       * cgraphclones.c (cgraph_node::create_version_clone): Do not
+       duplicate summaries.
+       * ipa-fnsummary.c (ipa_fn_summary_alloc): Allocate size summary
+       first.
+       (ipa_fn_summary_t::duplicate): Use get instead of get_create to
+       access call summaries.
+       (dump_ipa_call_summary): Be ready for missing edge summaries.
+       (analyze_function_body): Use get instead of get_create to access
+       edge summary.
+       (estimate_calls_size_and_time): Do not access summaries of
+       inlined edges; sanity check they are missing.
+       (ipa_call_context::estimate_size_and_time): Use get instead
+       of get_create to access node summary.
+       (inline_update_callee_summaries): Do not update depth of
+       inlined edge.
+       (ipa_merge_fn_summary_after_inlining): Remove inline edge from
+       growth caches.
+       (ipa_merge_fn_summary_after_inlining): Use get instead
+       of get_create.
+       * ipa-fnsummary.h (ipa_remove_from_growth_caches): Declare.
+       * ipa-inline-analyssi.c (edge_growth_cache): Turn to
+       fast summary.
+       (initialize_growth_caches): Update.
+       (do_estimate_edge_time): Remove redundant copy of context.
+       (ipa_remove_from_growth_caches): New function.
+       * ipa-inline.c (flatten_function): Update overall summary
+       only when optimizing.
+       (inline_to_all_callers): Update overall summary of function
+       inlined to.
+       * ipa-inline.h (edge_growth_cache): Turn to fast summary.
+       * symbol-summary.h (call_summary_base): Set m_initialize_when_cloning
+       to false.
+
 2019-11-04  Richard Biener  <rguenther@suse.de>
 
        * system.h: Include malloc.h if INCLUDE_MALLOC_H and HAVE_MALLINFO.
index 726e31e17f7833fed65549d4520b2de9e5d48b47..b0dc3722293fbe0456be42e924d25088bafce64a 100644 (file)
@@ -892,8 +892,6 @@ cgraph_node::create_version_clone (tree new_decl,
        e->redirect_callee (new_version);
      }
 
-   symtab->call_cgraph_duplication_hooks (this, new_version);
-
    dump_callgraph_transformation (this, new_version, suffix);
 
    return new_version;
index 72a01cff6c9f62ba1b36c9fd0fa091a7082cbbc8..64c4d95ccd4a4341e16d2e42eea3f4b361db0f29 100644 (file)
@@ -553,9 +553,9 @@ static void
 ipa_fn_summary_alloc (void)
 {
   gcc_checking_assert (!ipa_fn_summaries);
-  ipa_fn_summaries = ipa_fn_summary_t::create_ggc (symtab);
   ipa_size_summaries = new fast_function_summary <ipa_size_summary *, va_heap>
                                                         (symtab);
+  ipa_fn_summaries = ipa_fn_summary_t::create_ggc (symtab);
   ipa_call_summaries = new ipa_call_summary_t (symtab);
 }
 
@@ -688,7 +688,7 @@ ipa_fn_summary_t::duplicate (cgraph_node *src,
       for (edge = dst->callees; edge; edge = next)
        {
          predicate new_predicate;
-         class ipa_call_summary *es = ipa_call_summaries->get_create (edge);
+         class ipa_call_summary *es = ipa_call_summaries->get (edge);
          next = edge->next_callee;
 
          if (!edge->inline_failed)
@@ -707,7 +707,7 @@ ipa_fn_summary_t::duplicate (cgraph_node *src,
       for (edge = dst->indirect_calls; edge; edge = next)
        {
          predicate new_predicate;
-         class ipa_call_summary *es = ipa_call_summaries->get_create (edge);
+         class ipa_call_summary *es = ipa_call_summaries->get (edge);
          next = edge->next_callee;
 
          gcc_checking_assert (edge->inline_failed);
@@ -787,12 +787,15 @@ dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node,
       int i;
 
       fprintf (f,
-              "%*s%s/%i %s\n%*s  loop depth:%2i freq:%4.2f size:%2i time: %2i",
+              "%*s%s/%i %s\n%*s  freq:%4.2f",
               indent, "", callee->name (), callee->order,
               !edge->inline_failed
               ? "inlined" : cgraph_inline_failed_string (edge-> inline_failed),
-              indent, "", es->loop_depth, edge->sreal_frequency ().to_double (),
-              es->call_stmt_size, es->call_stmt_time);
+              indent, "", edge->sreal_frequency ().to_double ());
+
+      if (es)
+       fprintf (f, " loop depth:%2i size:%2i time: %2i",
+                es->loop_depth, es->call_stmt_size, es->call_stmt_time);
 
       ipa_fn_summary *s = ipa_fn_summaries->get (callee);
       ipa_size_summary *ss = ipa_size_summaries->get (callee);
@@ -801,14 +804,14 @@ dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node,
                 (int) (ss->size / ipa_fn_summary::size_scale),
                 (int) s->estimated_stack_size);
 
-      if (es->predicate)
+      if (es && es->predicate)
        {
          fprintf (f, " predicate: ");
          es->predicate->dump (f, info->conds);
        }
       else
        fprintf (f, "\n");
-      if (es->param.exists ())
+      if (es && es->param.exists ())
        for (i = 0; i < (int) es->param.length (); i++)
          {
            int prob = es->param[i].change_prob;
@@ -2480,7 +2483,7 @@ analyze_function_body (struct cgraph_node *node, bool early)
                  edge->speculative_call_info (direct, indirect, ref);
                  gcc_assert (direct == edge);
                  ipa_call_summary *es2
-                        = ipa_call_summaries->get_create (indirect);
+                        = ipa_call_summaries->get (indirect);
                  ipa_call_summaries->duplicate (edge, indirect,
                                                 es, es2);
                }
@@ -2924,10 +2927,20 @@ estimate_calls_size_and_time (struct cgraph_node *node, int *size,
   struct cgraph_edge *e;
   for (e = node->callees; e; e = e->next_callee)
     {
-      class ipa_call_summary *es = ipa_call_summaries->get_create (e);
+      if (!e->inline_failed)
+       {
+         gcc_checking_assert (!ipa_call_summaries->get (e));
+         estimate_calls_size_and_time (e->callee, size, min_size, time,
+                                       hints,
+                                       possible_truths,
+                                       known_vals, known_contexts,
+                                       known_aggs);
+         continue;
+       }
+      class ipa_call_summary *es = ipa_call_summaries->get (e);
 
       /* Do not care about zero sized builtins.  */
-      if (e->inline_failed && !es->call_stmt_size)
+      if (!es->call_stmt_size)
        {
          gcc_checking_assert (!es->call_stmt_time);
          continue;
@@ -2935,27 +2948,18 @@ estimate_calls_size_and_time (struct cgraph_node *node, int *size,
       if (!es->predicate
          || es->predicate->evaluate (possible_truths))
        {
-         if (e->inline_failed)
-           {
-             /* Predicates of calls shall not use NOT_CHANGED codes,
-                sowe do not need to compute probabilities.  */
-             estimate_edge_size_and_time (e, size,
-                                          es->predicate ? NULL : min_size,
-                                          time, REG_BR_PROB_BASE,
-                                          known_vals, known_contexts,
-                                          known_aggs, hints);
-           }
-         else
-           estimate_calls_size_and_time (e->callee, size, min_size, time,
-                                         hints,
-                                         possible_truths,
-                                         known_vals, known_contexts,
-                                         known_aggs);
+         /* Predicates of calls shall not use NOT_CHANGED codes,
+            sowe do not need to compute probabilities.  */
+         estimate_edge_size_and_time (e, size,
+                                      es->predicate ? NULL : min_size,
+                                      time, REG_BR_PROB_BASE,
+                                      known_vals, known_contexts,
+                                      known_aggs, hints);
        }
     }
   for (e = node->indirect_calls; e; e = e->next_callee)
     {
-      class ipa_call_summary *es = ipa_call_summaries->get_create (e);
+      class ipa_call_summary *es = ipa_call_summaries->get (e);
       if (!es->predicate
          || es->predicate->evaluate (possible_truths))
        estimate_edge_size_and_time (e, size,
@@ -3204,7 +3208,7 @@ ipa_call_context::estimate_size_and_time (int *ret_size,
                                          sreal *ret_nonspecialized_time,
                                          ipa_hints *ret_hints)
 {
-  class ipa_fn_summary *info = ipa_fn_summaries->get_create (m_node);
+  class ipa_fn_summary *info = ipa_fn_summaries->get (m_node);
   size_time_entry *e;
   int size = 0;
   sreal time = 0;
@@ -3382,7 +3386,8 @@ inline_update_callee_summaries (struct cgraph_node *node, int depth)
     {
       if (!e->inline_failed)
        inline_update_callee_summaries (e->callee, depth);
-      ipa_call_summaries->get (e)->loop_depth += depth;
+      else
+       ipa_call_summaries->get (e)->loop_depth += depth;
     }
   for (e = node->indirect_calls; e; e = e->next_callee)
     ipa_call_summaries->get (e)->loop_depth += depth;
@@ -3649,6 +3654,7 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
   /* Free summaries that are not maintained for inline clones/edges.  */
   ipa_call_summaries->remove (edge);
   ipa_fn_summaries->remove (edge->callee);
+  ipa_remove_from_growth_caches (edge);
 }
 
 /* For performance reasons ipa_merge_fn_summary_after_inlining is not updating
@@ -3657,8 +3663,8 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
 void
 ipa_update_overall_fn_summary (struct cgraph_node *node)
 {
-  class ipa_fn_summary *info = ipa_fn_summaries->get_create (node);
-  class ipa_size_summary *size_info = ipa_size_summaries->get_create (node);
+  class ipa_fn_summary *info = ipa_fn_summaries->get (node);
+  class ipa_size_summary *size_info = ipa_size_summaries->get (node);
   size_time_entry *e;
   int i;
 
index 91488a998814e069672396d7bbedc035a08bb325..8f9eaf560acf0069e9eb93352eb1c458cb0e1c05 100644 (file)
@@ -364,5 +364,6 @@ void evaluate_properties_for_edge (struct cgraph_edge *e,
 
 void ipa_fnsummary_c_finalize (void);
 HOST_WIDE_INT ipa_get_stack_frame_offset (struct cgraph_node *node);
+void ipa_remove_from_growth_caches (struct cgraph_edge *edge);
 
 #endif /* GCC_IPA_FNSUMMARY_H */
index 436310596ac475f9944424ddea2b329bb0d78675..ea1fae484ff1e62a652816310129289d1b1588f9 100644 (file)
@@ -51,7 +51,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimplify.h"
 
 /* Cached node/edge growths.  */
-call_summary<edge_growth_cache_entry *> *edge_growth_cache = NULL;
+fast_call_summary<edge_growth_cache_entry *, va_heap> *edge_growth_cache = NULL;
 
 /* The context cache remembers estimated time/size and hints for given
    ipa_call_context of a call.  */
@@ -125,7 +125,7 @@ void
 initialize_growth_caches ()
 {
   edge_growth_cache
-    = new call_summary<edge_growth_cache_entry *> (symtab, false);
+    = new fast_call_summary<edge_growth_cache_entry *, va_heap> (symtab);
   node_context_cache
     = new fast_function_summary<node_context_summary *, va_heap> (symtab);
 }
@@ -219,7 +219,6 @@ do_estimate_edge_time (struct cgraph_edge *edge)
          else
            node_context_cache_clear++;
          e->entry.ctx.release (true);
-         e->entry.ctx = ctx;
          ctx.estimate_size_and_time (&size, &min_size,
                                      &time, &nonspec_time, &hints);
          e->entry.size = size;
@@ -275,6 +274,16 @@ reset_node_cache (struct cgraph_node *node)
     node_context_cache->remove (node);
 }
 
+/* Remove EDGE from caches once it was inlined.  */
+void
+ipa_remove_from_growth_caches (struct cgraph_edge *edge)
+{
+  if (node_context_cache)
+    node_context_cache->remove (edge->callee);
+  if (edge_growth_cache)
+    edge_growth_cache->remove (edge);
+}
+
 /* Return estimated callee growth after inlining EDGE.
    Only to be called via estimate_edge_size.  */
 
index dacec7d401b728cbeb3ebd99a3f169c409fb4bdf..b2c90cc2dd99e001ce31868cefe6fccd730cfe3e 100644 (file)
@@ -2290,9 +2290,9 @@ flatten_function (struct cgraph_node *node, bool early, bool update)
     }
 
   node->aux = NULL;
-  if (update)
-    ipa_update_overall_fn_summary (node->inlined_to
-                                  ? node->inlined_to : node);
+  cgraph_node *where = node->inlined_to ? node->inlined_to : node;
+  if (update && opt_for_fn (where->decl, optimize))
+    ipa_update_overall_fn_summary (where);
 }
 
 /* Inline NODE to all callers.  Worker for cgraph_for_node_and_aliases.
@@ -2367,7 +2367,7 @@ inline_to_all_callers (struct cgraph_node *node, void *data)
      we have a lot of calls to the same function.  */
   for (hash_set<cgraph_node *>::iterator i = callers.begin ();
        i != callers.end (); ++i)
-    ipa_update_overall_fn_summary (*i);
+    ipa_update_overall_fn_summary ((*i)->inlined_to ? (*i)->inlined_to : *i);
   return res;
 }
 
index 7675b9e08fa8585b3105550d782c8f262a1067a6..33205a0e6dba3006dc78e83e99badcd46289559e 100644 (file)
@@ -39,7 +39,7 @@ public:
       hints (hints) {}
 };
 
-extern call_summary<edge_growth_cache_entry *> *edge_growth_cache;
+extern fast_call_summary<edge_growth_cache_entry *, va_heap> *edge_growth_cache;
 
 /* In ipa-inline-analysis.c  */
 int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *);
index 14da3a14c3ca5f5bd3de1a3d618ce8e5b13dcd6b..f677f16e0cea1626b23c336d604ef43d9caaf4eb 100644 (file)
@@ -532,7 +532,7 @@ class call_summary_base
 public:
   /* Default construction takes SYMTAB as an argument.  */
   call_summary_base (symbol_table *symtab): m_symtab (symtab),
-  m_initialize_when_cloning (true)
+  m_initialize_when_cloning (false)
   {}
 
   /* Basic implementation of removal operation.  */