Commit 40ff1364 by Richard Biener Committed by Richard Biener

re PR ipa/44563 (GCC uses a lot of RAM when compiling a large numbers of functions)

2015-03-10  Richard Biener  <rguenther@suse.de>

	PR middle-end/44563
	* cgraph.h (struct cgraph_edge_hasher): Add hash overload
	for compare_type.
	* cgraph.c (cgraph_edge_hasher::hash): Inline htab_hash_pointer.
	(cgraph_update_edge_in_call_site_hash): Use cgraph_edge_hasher::hash.
	(cgraph_add_edge_to_call_site_hash): Likewise.
	(cgraph_node::get_edge): Likewise.
	(cgraph_edge::set_call_stmt): Likewise.
	(cgraph_edge::remove_caller): Likewise.

From-SVN: r221308
parent c457f751
2015-03-10 Richard Biener <rguenther@suse.de>
PR middle-end/44563
* cgraph.h (struct cgraph_edge_hasher): Add hash overload
for compare_type.
* cgraph.c (cgraph_edge_hasher::hash): Inline htab_hash_pointer.
(cgraph_update_edge_in_call_site_hash): Use cgraph_edge_hasher::hash.
(cgraph_add_edge_to_call_site_hash): Likewise.
(cgraph_node::get_edge): Likewise.
(cgraph_edge::set_call_stmt): Likewise.
(cgraph_edge::remove_caller): Likewise.
2015-03-10 Chung-Ju Wu <jasonwucj@gmail.com> 2015-03-10 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.h (callee_saved_regs_size): Rename to ... * config/nds32/nds32.h (callee_saved_regs_size): Rename to ...
......
...@@ -663,7 +663,19 @@ cgraph_node::get_for_asmname (tree asmname) ...@@ -663,7 +663,19 @@ cgraph_node::get_for_asmname (tree asmname)
hashval_t hashval_t
cgraph_edge_hasher::hash (cgraph_edge *e) cgraph_edge_hasher::hash (cgraph_edge *e)
{ {
return htab_hash_pointer (e->call_stmt); /* This is a really poor hash function, but it is what htab_hash_pointer
uses. */
return (hashval_t) ((intptr_t)e->call_stmt >> 3);
}
/* Returns a hash value for X (which really is a cgraph_edge). */
hashval_t
cgraph_edge_hasher::hash (gimple call_stmt)
{
/* This is a really poor hash function, but it is what htab_hash_pointer
uses. */
return (hashval_t) ((intptr_t)call_stmt >> 3);
} }
/* Return nonzero if the call_stmt of of cgraph_edge X is stmt *Y. */ /* Return nonzero if the call_stmt of of cgraph_edge X is stmt *Y. */
...@@ -680,9 +692,8 @@ static inline void ...@@ -680,9 +692,8 @@ static inline void
cgraph_update_edge_in_call_site_hash (cgraph_edge *e) cgraph_update_edge_in_call_site_hash (cgraph_edge *e)
{ {
gimple call = e->call_stmt; gimple call = e->call_stmt;
*e->caller->call_site_hash->find_slot_with_hash (call, *e->caller->call_site_hash->find_slot_with_hash
htab_hash_pointer (call), (call, cgraph_edge_hasher::hash (call), INSERT) = e;
INSERT) = e;
} }
/* Add call graph edge E to call site hash of its caller. */ /* Add call graph edge E to call site hash of its caller. */
...@@ -695,8 +706,7 @@ cgraph_add_edge_to_call_site_hash (cgraph_edge *e) ...@@ -695,8 +706,7 @@ cgraph_add_edge_to_call_site_hash (cgraph_edge *e)
if (e->speculative && e->indirect_unknown_callee) if (e->speculative && e->indirect_unknown_callee)
return; return;
cgraph_edge **slot = e->caller->call_site_hash->find_slot_with_hash cgraph_edge **slot = e->caller->call_site_hash->find_slot_with_hash
(e->call_stmt, (e->call_stmt, cgraph_edge_hasher::hash (e->call_stmt), INSERT);
htab_hash_pointer (e->call_stmt), INSERT);
if (*slot) if (*slot)
{ {
gcc_assert (((cgraph_edge *)*slot)->speculative); gcc_assert (((cgraph_edge *)*slot)->speculative);
...@@ -718,8 +728,8 @@ cgraph_node::get_edge (gimple call_stmt) ...@@ -718,8 +728,8 @@ cgraph_node::get_edge (gimple call_stmt)
int n = 0; int n = 0;
if (call_site_hash) if (call_site_hash)
return call_site_hash->find_with_hash (call_stmt, return call_site_hash->find_with_hash
htab_hash_pointer (call_stmt)); (call_stmt, cgraph_edge_hasher::hash (call_stmt));
/* This loop may turn out to be performance problem. In such case adding /* This loop may turn out to be performance problem. In such case adding
hashtables into call nodes with very many edges is probably best hashtables into call nodes with very many edges is probably best
...@@ -782,7 +792,7 @@ cgraph_edge::set_call_stmt (gcall *new_stmt, bool update_speculative) ...@@ -782,7 +792,7 @@ cgraph_edge::set_call_stmt (gcall *new_stmt, bool update_speculative)
&& (!speculative || !indirect_unknown_callee)) && (!speculative || !indirect_unknown_callee))
{ {
caller->call_site_hash->remove_elt_with_hash caller->call_site_hash->remove_elt_with_hash
(call_stmt, htab_hash_pointer (call_stmt)); (call_stmt, cgraph_edge_hasher::hash (call_stmt));
} }
cgraph_edge *e = this; cgraph_edge *e = this;
...@@ -987,8 +997,8 @@ cgraph_edge::remove_caller (void) ...@@ -987,8 +997,8 @@ cgraph_edge::remove_caller (void)
caller->callees = next_callee; caller->callees = next_callee;
} }
if (caller->call_site_hash) if (caller->call_site_hash)
caller->call_site_hash->remove_elt_with_hash (call_stmt, caller->call_site_hash->remove_elt_with_hash
htab_hash_pointer (call_stmt)); (call_stmt, cgraph_edge_hasher::hash (call_stmt));
} }
/* Put the edge onto the free list. */ /* Put the edge onto the free list. */
......
...@@ -788,6 +788,7 @@ struct cgraph_edge_hasher : ggc_hasher<cgraph_edge *> ...@@ -788,6 +788,7 @@ struct cgraph_edge_hasher : ggc_hasher<cgraph_edge *>
typedef gimple compare_type; typedef gimple compare_type;
static hashval_t hash (cgraph_edge *); static hashval_t hash (cgraph_edge *);
static hashval_t hash (gimple);
static bool equal (cgraph_edge *, gimple); static bool equal (cgraph_edge *, gimple);
}; };
......
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