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
This commit is contained in:
Richard Biener 2015-03-10 08:25:31 +00:00 committed by Richard Biener
parent c457f75178
commit 40ff136498
3 changed files with 34 additions and 11 deletions

View File

@ -1,3 +1,15 @@
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 ...

View File

@ -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
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)
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)
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)
&& (!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)
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. */

View File

@ -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);
}; };