aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.h
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2019-07-28 19:10:26 +0200
committerMartin Liska <marxin@gcc.gnu.org>2019-07-28 17:10:26 +0000
commitfe248a88e5ec39a2faef1fb35a81f0f921fa952d (patch)
treeba5e596764b3e32248ad0ad682802284d60fddae /gcc/cgraph.h
parent4f394a9e1c5fffda66f822b13d2b9cc2623db653 (diff)
downloadgcc-fe248a88e5ec39a2faef1fb35a81f0f921fa952d.zip
gcc-fe248a88e5ec39a2faef1fb35a81f0f921fa952d.tar.gz
gcc-fe248a88e5ec39a2faef1fb35a81f0f921fa952d.tar.bz2
Release cgraph_{node,edge} via ggc_free (PR ipa/89330).
2019-07-28 Martin Liska <mliska@suse.cz> PR ipa/89330 * cgraph.c (symbol_table::create_edge): Always allocate a cgraph_edge. (symbol_table::free_edge): Store summary_id to edge_released_summary_ids if != -1; * cgraph.h (NEXT_FREE_NODE): Remove. (SET_NEXT_FREE_NODE): Likewise. (NEXT_FREE_EDGE): Likewise. (symbol_table::release_symbol): Store summary_id to cgraph_released_summary_ids if != -1; (symbol_table::allocate_cgraph_symbol): Always allocate a cgraph_node. From-SVN: r273857
Diffstat (limited to 'gcc/cgraph.h')
-rw-r--r--gcc/cgraph.h58
1 files changed, 24 insertions, 34 deletions
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index a7c97de..fbf20b3 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -2027,12 +2027,6 @@ is_a_helper <varpool_node *>::test (symtab_node *p)
return p && p->type == SYMTAB_VARIABLE;
}
-/* Macros to access the next item in the list of free cgraph nodes and
- edges. */
-#define NEXT_FREE_NODE(NODE) dyn_cast<cgraph_node *> ((NODE)->next)
-#define SET_NEXT_FREE_NODE(NODE,NODE2) ((NODE))->next = NODE2
-#define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
-
typedef void (*cgraph_edge_hook)(cgraph_edge *, void *);
typedef void (*cgraph_node_hook)(cgraph_node *, void *);
typedef void (*varpool_node_hook)(varpool_node *, void *);
@@ -2088,7 +2082,8 @@ public:
friend struct cgraph_edge;
symbol_table (): cgraph_max_uid (1), cgraph_max_summary_id (0),
- edges_max_uid (1), edges_max_summary_id (0)
+ edges_max_uid (1), edges_max_summary_id (0),
+ cgraph_released_summary_ids (), edge_released_summary_ids ()
{
}
@@ -2297,14 +2292,22 @@ public:
/* Assign a new summary ID for the callgraph NODE. */
inline int assign_summary_id (cgraph_node *node)
{
- node->m_summary_id = cgraph_max_summary_id++;
+ if (!cgraph_released_summary_ids.is_empty ())
+ node->m_summary_id = cgraph_released_summary_ids.pop ();
+ else
+ node->m_summary_id = cgraph_max_summary_id++;
+
return node->m_summary_id;
}
/* Assign a new summary ID for the callgraph EDGE. */
inline int assign_summary_id (cgraph_edge *edge)
{
- edge->m_summary_id = edges_max_summary_id++;
+ if (!edge_released_summary_ids.is_empty ())
+ edge->m_summary_id = edge_released_summary_ids.pop ();
+ else
+ edge->m_summary_id = edges_max_summary_id++;
+
return edge->m_summary_id;
}
@@ -2320,14 +2323,15 @@ public:
int edges_max_uid;
int edges_max_summary_id;
+ /* Vector of released summary IDS for cgraph nodes. */
+ vec<int> GTY ((skip)) cgraph_released_summary_ids;
+
+ /* Vector of released summary IDS for cgraph nodes. */
+ vec<int> GTY ((skip)) edge_released_summary_ids;
+
symtab_node* GTY(()) nodes;
asm_node* GTY(()) asmnodes;
asm_node* GTY(()) asm_last_node;
- cgraph_node* GTY(()) free_nodes;
-
- /* Head of a linked list of unused (freed) call graph edges.
- Do not GTY((delete)) this list so UIDs gets reliably recycled. */
- cgraph_edge * GTY(()) free_edges;
/* The order index of the next symtab node to be created. This is
used so that we can sort the cgraph nodes in order by when we saw
@@ -2687,15 +2691,9 @@ inline void
symbol_table::release_symbol (cgraph_node *node)
{
cgraph_count--;
-
- /* Clear out the node to NULL all pointers and add the node to the free
- list. */
- int summary_id = node->m_summary_id;
- memset (node, 0, sizeof (*node));
- node->type = SYMTAB_FUNCTION;
- node->m_summary_id = summary_id;
- SET_NEXT_FREE_NODE (node, free_nodes);
- free_nodes = node;
+ if (node->m_summary_id != -1)
+ cgraph_released_summary_ids.safe_push (node->m_summary_id);
+ ggc_free (node);
}
/* Allocate new callgraph node. */
@@ -2705,17 +2703,9 @@ symbol_table::allocate_cgraph_symbol (void)
{
cgraph_node *node;
- if (free_nodes)
- {
- node = free_nodes;
- free_nodes = NEXT_FREE_NODE (node);
- }
- else
- {
- node = ggc_cleared_alloc<cgraph_node> ();
- node->m_summary_id = -1;
- }
-
+ node = ggc_cleared_alloc<cgraph_node> ();
+ node->type = SYMTAB_FUNCTION;
+ node->m_summary_id = -1;
node->m_uid = cgraph_max_uid++;
return node;
}