aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-03-10 08:25:31 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-03-10 08:25:31 +0000
commit40ff136498f39df5732116b55090448bf1be9684 (patch)
treed1de264ae6e54268322deca2976d4fa689a77be6 /gcc/cgraph.c
parentc457f75178f02049189b3369af3d5ee95adaa166 (diff)
downloadgcc-40ff136498f39df5732116b55090448bf1be9684.zip
gcc-40ff136498f39df5732116b55090448bf1be9684.tar.gz
gcc-40ff136498f39df5732116b55090448bf1be9684.tar.bz2
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
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index e4d5505..5ca1901 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -663,7 +663,19 @@ cgraph_node::get_for_asmname (tree asmname)
hashval_t
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. */
@@ -680,9 +692,8 @@ static inline void
cgraph_update_edge_in_call_site_hash (cgraph_edge *e)
{
gimple call = e->call_stmt;
- *e->caller->call_site_hash->find_slot_with_hash (call,
- htab_hash_pointer (call),
- INSERT) = e;
+ *e->caller->call_site_hash->find_slot_with_hash
+ (call, cgraph_edge_hasher::hash (call), INSERT) = e;
}
/* 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)
return;
cgraph_edge **slot = e->caller->call_site_hash->find_slot_with_hash
- (e->call_stmt,
- htab_hash_pointer (e->call_stmt), INSERT);
+ (e->call_stmt, cgraph_edge_hasher::hash (e->call_stmt), INSERT);
if (*slot)
{
gcc_assert (((cgraph_edge *)*slot)->speculative);
@@ -718,8 +728,8 @@ cgraph_node::get_edge (gimple call_stmt)
int n = 0;
if (call_site_hash)
- return call_site_hash->find_with_hash (call_stmt,
- htab_hash_pointer (call_stmt));
+ return call_site_hash->find_with_hash
+ (call_stmt, cgraph_edge_hasher::hash (call_stmt));
/* This loop may turn out to be performance problem. In such case adding
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))
{
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;
@@ -987,8 +997,8 @@ cgraph_edge::remove_caller (void)
caller->callees = next_callee;
}
if (caller->call_site_hash)
- caller->call_site_hash->remove_elt_with_hash (call_stmt,
- htab_hash_pointer (call_stmt));
+ caller->call_site_hash->remove_elt_with_hash
+ (call_stmt, cgraph_edge_hasher::hash (call_stmt));
}
/* Put the edge onto the free list. */