Commit 9fb50ad8 by Martin Liska Committed by Martin Liska

Port edge_growth_cache to call_summary.

2018-06-08  Martin Liska  <mliska@suse.cz>

	* ipa-inline-analysis.c (inline_edge_removal_hook): Remove.
	(initialize_growth_caches): Remove.
	(free_growth_caches): Likewise.
	(do_estimate_edge_time): Use edge_growth_cache.
	(do_estimate_edge_size): Likewise.
	(do_estimate_edge_hints): Likewise.
	* ipa-inline.c (reset_edge_caches): Likewise.
	(recursive_inlining): Likewise.
	(inline_small_functions): Likewise.
	* ipa-inline.h (initialize_growth_caches): Remove.
	(estimate_edge_size): Likewise.
	(estimate_edge_time): Likewise.
	(estimate_edge_hints): Likewise.
	(reset_edge_growth_cache): Likewise.
	* symbol-summary.h (call_summary::remove): New method.

From-SVN: r261318
parent 1ac2bdb4
2018-06-08 Martin Liska <mliska@suse.cz> 2018-06-08 Martin Liska <mliska@suse.cz>
* ipa-inline-analysis.c (inline_edge_removal_hook): Remove.
(initialize_growth_caches): Remove.
(free_growth_caches): Likewise.
(do_estimate_edge_time): Use edge_growth_cache.
(do_estimate_edge_size): Likewise.
(do_estimate_edge_hints): Likewise.
* ipa-inline.c (reset_edge_caches): Likewise.
(recursive_inlining): Likewise.
(inline_small_functions): Likewise.
* ipa-inline.h (initialize_growth_caches): Remove.
(estimate_edge_size): Likewise.
(estimate_edge_time): Likewise.
(estimate_edge_hints): Likewise.
(reset_edge_growth_cache): Likewise.
* symbol-summary.h (call_summary::remove): New method.
2018-06-08 Martin Liska <mliska@suse.cz>
* ipa-cp.c (class edge_clone_summary): New summary. * ipa-cp.c (class edge_clone_summary): New summary.
(grow_edge_clone_vectors): Remove. (grow_edge_clone_vectors): Remove.
(ipcp_edge_duplication_hook): Remove. (ipcp_edge_duplication_hook): Remove.
......
...@@ -51,9 +51,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -51,9 +51,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimplify.h" #include "gimplify.h"
/* Cached node/edge growths. */ /* Cached node/edge growths. */
vec<edge_growth_cache_entry> edge_growth_cache; call_summary<edge_growth_cache_entry *> *edge_growth_cache = NULL;
static struct cgraph_edge_hook_list *edge_removal_hook_holder;
/* Give initial reasons why inlining would fail on EDGE. This gets either /* Give initial reasons why inlining would fail on EDGE. This gets either
nullified or usually overwritten by more precise reasons later. */ nullified or usually overwritten by more precise reasons later. */
...@@ -80,40 +78,13 @@ initialize_inline_failed (struct cgraph_edge *e) ...@@ -80,40 +78,13 @@ initialize_inline_failed (struct cgraph_edge *e)
} }
/* Keep edge cache consistent across edge removal. */
static void
inline_edge_removal_hook (struct cgraph_edge *edge,
void *data ATTRIBUTE_UNUSED)
{
reset_edge_growth_cache (edge);
}
/* Initialize growth caches. */
void
initialize_growth_caches (void)
{
if (!edge_removal_hook_holder)
edge_removal_hook_holder =
symtab->add_edge_removal_hook (&inline_edge_removal_hook, NULL);
if (symtab->edges_max_uid)
edge_growth_cache.safe_grow_cleared (symtab->edges_max_uid);
}
/* Free growth caches. */ /* Free growth caches. */
void void
free_growth_caches (void) free_growth_caches (void)
{ {
if (edge_removal_hook_holder) delete edge_growth_cache;
{ edge_growth_cache = NULL;
symtab->remove_edge_removal_hook (edge_removal_hook_holder);
edge_removal_hook_holder = NULL;
}
edge_growth_cache.release ();
} }
/* Return hints derrived from EDGE. */ /* Return hints derrived from EDGE. */
...@@ -188,17 +159,17 @@ do_estimate_edge_time (struct cgraph_edge *edge) ...@@ -188,17 +159,17 @@ do_estimate_edge_time (struct cgraph_edge *edge)
gcc_checking_assert (time >= 0); gcc_checking_assert (time >= 0);
/* When caching, update the cache entry. */ /* When caching, update the cache entry. */
if (edge_growth_cache.exists ()) if (edge_growth_cache != NULL)
{ {
ipa_fn_summaries->get_create (edge->callee)->min_size = min_size; ipa_fn_summaries->get_create (edge->callee)->min_size = min_size;
if ((int) edge_growth_cache.length () <= edge->uid) edge_growth_cache_entry *entry
edge_growth_cache.safe_grow_cleared (symtab->edges_max_uid); = edge_growth_cache->get_create (edge);
edge_growth_cache[edge->uid].time = time; entry->time = time;
edge_growth_cache[edge->uid].nonspec_time = nonspec_time; entry->nonspec_time = nonspec_time;
edge_growth_cache[edge->uid].size = size + (size >= 0); entry->size = size + (size >= 0);
hints |= simple_edge_hints (edge); hints |= simple_edge_hints (edge);
edge_growth_cache[edge->uid].hints = hints + 1; entry->hints = hints + 1;
} }
return time; return time;
} }
...@@ -219,10 +190,10 @@ do_estimate_edge_size (struct cgraph_edge *edge) ...@@ -219,10 +190,10 @@ do_estimate_edge_size (struct cgraph_edge *edge)
/* When we do caching, use do_estimate_edge_time to populate the entry. */ /* When we do caching, use do_estimate_edge_time to populate the entry. */
if (edge_growth_cache.exists ()) if (edge_growth_cache != NULL)
{ {
do_estimate_edge_time (edge); do_estimate_edge_time (edge);
size = edge_growth_cache[edge->uid].size; size = edge_growth_cache->get (edge)->size;
gcc_checking_assert (size); gcc_checking_assert (size);
return size - (size > 0); return size - (size > 0);
} }
...@@ -260,10 +231,10 @@ do_estimate_edge_hints (struct cgraph_edge *edge) ...@@ -260,10 +231,10 @@ do_estimate_edge_hints (struct cgraph_edge *edge)
/* When we do caching, use do_estimate_edge_time to populate the entry. */ /* When we do caching, use do_estimate_edge_time to populate the entry. */
if (edge_growth_cache.exists ()) if (edge_growth_cache != NULL)
{ {
do_estimate_edge_time (edge); do_estimate_edge_time (edge);
hints = edge_growth_cache[edge->uid].hints; hints = edge_growth_cache->get (edge)->hints;
gcc_checking_assert (hints); gcc_checking_assert (hints);
return hints - 1; return hints - 1;
} }
......
...@@ -1287,9 +1287,10 @@ reset_edge_caches (struct cgraph_node *node) ...@@ -1287,9 +1287,10 @@ reset_edge_caches (struct cgraph_node *node)
if (where->global.inlined_to) if (where->global.inlined_to)
where = where->global.inlined_to; where = where->global.inlined_to;
for (edge = where->callers; edge; edge = edge->next_caller) if (edge_growth_cache != NULL)
if (edge->inline_failed) for (edge = where->callers; edge; edge = edge->next_caller)
reset_edge_growth_cache (edge); if (edge->inline_failed)
edge_growth_cache->remove (edge);
FOR_EACH_ALIAS (where, ref) FOR_EACH_ALIAS (where, ref)
reset_edge_caches (dyn_cast <cgraph_node *> (ref->referring)); reset_edge_caches (dyn_cast <cgraph_node *> (ref->referring));
...@@ -1302,8 +1303,8 @@ reset_edge_caches (struct cgraph_node *node) ...@@ -1302,8 +1303,8 @@ reset_edge_caches (struct cgraph_node *node)
e = e->callee->callees; e = e->callee->callees;
else else
{ {
if (e->inline_failed) if (edge_growth_cache != NULL && e->inline_failed)
reset_edge_growth_cache (e); edge_growth_cache->remove (e);
if (e->next_callee) if (e->next_callee)
e = e->next_callee; e = e->next_callee;
else else
...@@ -1496,13 +1497,15 @@ recursive_inlining (struct cgraph_edge *edge, ...@@ -1496,13 +1497,15 @@ recursive_inlining (struct cgraph_edge *edge,
if (master_clone) if (master_clone)
{ {
curr->redirect_callee (master_clone); curr->redirect_callee (master_clone);
reset_edge_growth_cache (curr); if (edge_growth_cache != NULL)
edge_growth_cache->remove (curr);
} }
if (estimate_size_after_inlining (node, curr) > limit) if (estimate_size_after_inlining (node, curr) > limit)
{ {
curr->redirect_callee (dest); curr->redirect_callee (dest);
reset_edge_growth_cache (curr); if (edge_growth_cache != NULL)
edge_growth_cache->remove (curr);
break; break;
} }
...@@ -1516,7 +1519,8 @@ recursive_inlining (struct cgraph_edge *edge, ...@@ -1516,7 +1519,8 @@ recursive_inlining (struct cgraph_edge *edge,
if (!want_inline_self_recursive_call_p (curr, node, false, depth)) if (!want_inline_self_recursive_call_p (curr, node, false, depth))
{ {
curr->redirect_callee (dest); curr->redirect_callee (dest);
reset_edge_growth_cache (curr); if (edge_growth_cache != NULL)
edge_growth_cache->remove (curr);
continue; continue;
} }
...@@ -1541,7 +1545,8 @@ recursive_inlining (struct cgraph_edge *edge, ...@@ -1541,7 +1545,8 @@ recursive_inlining (struct cgraph_edge *edge,
if (!e->inline_failed) if (!e->inline_failed)
clone_inlined_nodes (e, true, false, NULL); clone_inlined_nodes (e, true, false, NULL);
curr->redirect_callee (master_clone); curr->redirect_callee (master_clone);
reset_edge_growth_cache (curr); if (edge_growth_cache != NULL)
edge_growth_cache->remove (curr);
} }
inline_call (curr, false, new_edges, &overall_size, true); inline_call (curr, false, new_edges, &overall_size, true);
...@@ -1798,7 +1803,8 @@ inline_small_functions (void) ...@@ -1798,7 +1803,8 @@ inline_small_functions (void)
max_count = max_count.max (edge->count.ipa ()); max_count = max_count.max (edge->count.ipa ());
} }
ipa_free_postorder_info (); ipa_free_postorder_info ();
initialize_growth_caches (); edge_growth_cache
= new call_summary<edge_growth_cache_entry *> (symtab, false);
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
...@@ -1892,7 +1898,8 @@ inline_small_functions (void) ...@@ -1892,7 +1898,8 @@ inline_small_functions (void)
sreal old_time_est = estimate_edge_time (edge); sreal old_time_est = estimate_edge_time (edge);
int old_hints_est = estimate_edge_hints (edge); int old_hints_est = estimate_edge_hints (edge);
reset_edge_growth_cache (edge); if (edge_growth_cache != NULL)
edge_growth_cache->remove (edge);
gcc_assert (old_size_est == estimate_edge_size (edge)); gcc_assert (old_size_est == estimate_edge_size (edge));
gcc_assert (old_time_est == estimate_edge_time (edge)); gcc_assert (old_time_est == estimate_edge_time (edge));
/* FIXME: /* FIXME:
...@@ -1906,7 +1913,7 @@ inline_small_functions (void) ...@@ -1906,7 +1913,7 @@ inline_small_functions (void)
for given invocation but that will be better done once whole for given invocation but that will be better done once whole
code is converted to sreals. Disable for now and revert to "wrong" code is converted to sreals. Disable for now and revert to "wrong"
value so enable/disable checking paths agree. */ value so enable/disable checking paths agree. */
edge_growth_cache[edge->uid].hints = old_hints_est + 1; edge_growth_cache->get (edge)->hints = old_hints_est + 1;
/* When updating the edge costs, we only decrease badness in the keys. /* When updating the edge costs, we only decrease badness in the keys.
Increases of badness are handled lazilly; when we see key with out Increases of badness are handled lazilly; when we see key with out
......
...@@ -38,7 +38,7 @@ struct edge_growth_cache_entry ...@@ -38,7 +38,7 @@ struct edge_growth_cache_entry
hints (hints) {} hints (hints) {}
}; };
extern vec<edge_growth_cache_entry> edge_growth_cache; extern call_summary<edge_growth_cache_entry *> *edge_growth_cache;
/* In ipa-inline-analysis.c */ /* In ipa-inline-analysis.c */
int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *); int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *);
...@@ -47,7 +47,6 @@ bool growth_likely_positive (struct cgraph_node *, int); ...@@ -47,7 +47,6 @@ bool growth_likely_positive (struct cgraph_node *, int);
int do_estimate_edge_size (struct cgraph_edge *edge); int do_estimate_edge_size (struct cgraph_edge *edge);
sreal do_estimate_edge_time (struct cgraph_edge *edge); sreal do_estimate_edge_time (struct cgraph_edge *edge);
ipa_hints do_estimate_edge_hints (struct cgraph_edge *edge); ipa_hints do_estimate_edge_hints (struct cgraph_edge *edge);
void initialize_growth_caches (void);
void free_growth_caches (void); void free_growth_caches (void);
/* In ipa-inline.c */ /* In ipa-inline.c */
...@@ -69,11 +68,12 @@ extern int nfunctions_inlined; ...@@ -69,11 +68,12 @@ extern int nfunctions_inlined;
static inline int static inline int
estimate_edge_size (struct cgraph_edge *edge) estimate_edge_size (struct cgraph_edge *edge)
{ {
int ret; edge_growth_cache_entry *entry;
if ((int)edge_growth_cache.length () <= edge->uid if (edge_growth_cache == NULL
|| !(ret = edge_growth_cache[edge->uid].size)) || (entry = edge_growth_cache->get (edge)) == NULL
|| entry->size == 0)
return do_estimate_edge_size (edge); return do_estimate_edge_size (edge);
return ret - (ret > 0); return entry->size - (entry->size > 0);
} }
/* Return estimated callee growth after inlining EDGE. */ /* Return estimated callee growth after inlining EDGE. */
...@@ -92,13 +92,14 @@ estimate_edge_growth (struct cgraph_edge *edge) ...@@ -92,13 +92,14 @@ estimate_edge_growth (struct cgraph_edge *edge)
static inline sreal static inline sreal
estimate_edge_time (struct cgraph_edge *edge, sreal *nonspec_time = NULL) estimate_edge_time (struct cgraph_edge *edge, sreal *nonspec_time = NULL)
{ {
sreal ret; edge_growth_cache_entry *entry;
if ((int)edge_growth_cache.length () <= edge->uid if (edge_growth_cache == NULL
|| !edge_growth_cache[edge->uid].size) || (entry = edge_growth_cache->get (edge)) == NULL
|| entry->time == 0)
return do_estimate_edge_time (edge); return do_estimate_edge_time (edge);
if (nonspec_time) if (nonspec_time)
*nonspec_time = edge_growth_cache[edge->uid].nonspec_time; *nonspec_time = edge_growth_cache->get (edge)->nonspec_time;
return edge_growth_cache[edge->uid].time; return entry->time;
} }
...@@ -108,23 +109,12 @@ estimate_edge_time (struct cgraph_edge *edge, sreal *nonspec_time = NULL) ...@@ -108,23 +109,12 @@ estimate_edge_time (struct cgraph_edge *edge, sreal *nonspec_time = NULL)
static inline ipa_hints static inline ipa_hints
estimate_edge_hints (struct cgraph_edge *edge) estimate_edge_hints (struct cgraph_edge *edge)
{ {
ipa_hints ret; edge_growth_cache_entry *entry;
if ((int)edge_growth_cache.length () <= edge->uid if (edge_growth_cache == NULL
|| !(ret = edge_growth_cache[edge->uid].hints)) || (entry = edge_growth_cache->get (edge)) == NULL
|| entry->hints == 0)
return do_estimate_edge_hints (edge); return do_estimate_edge_hints (edge);
return ret - 1; return entry->hints - 1;
}
/* Reset cached value for EDGE. */
static inline void
reset_edge_growth_cache (struct cgraph_edge *edge)
{
if ((int)edge_growth_cache.length () > edge->uid)
{
struct edge_growth_cache_entry zero (0, 0, 0, 0);
edge_growth_cache[edge->uid] = zero;
}
} }
#endif /* GCC_IPA_INLINE_H */ #endif /* GCC_IPA_INLINE_H */
...@@ -384,6 +384,18 @@ public: ...@@ -384,6 +384,18 @@ public:
return get (hashable_uid (edge), false); return get (hashable_uid (edge), false);
} }
/* Remove edge from summary. */
void remove (cgraph_edge *edge)
{
int uid = hashable_uid (edge);
T **v = m_map.get (uid);
if (v)
{
m_map.remove (uid);
release (*v);
}
}
/* Return number of elements handled by data structure. */ /* Return number of elements handled by data structure. */
size_t elements () size_t elements ()
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment