* lto-streamer-out.c (hash_scc): Avoid quadratic hashing loop.

From-SVN: r212404
This commit is contained in:
Jan Hubicka 2014-07-09 21:09:50 +02:00 committed by Jan Hubicka
parent 63dfbb9505
commit da22f50517
2 changed files with 14 additions and 24 deletions

View file

@ -1,3 +1,7 @@
2014-07-08 Jan Hubicka <hubicka@ucw.cz>
* lto-streamer-out.c (hash_scc): Avoid quadratic hashing loop.
2014-07-08 Jan Hubicka <hubicka@ucw.cz>
Revert:

View file

@ -1131,32 +1131,18 @@ hash_scc (struct streamer_tree_cache_d *cache, unsigned first, unsigned size)
/* Sort the SCC of type, hash pairs so that when we mix in
all members of the SCC the hash value becomes independent on
the order we visited the SCC. Disregard hashes equal to
the hash of the tree we mix into because we cannot guarantee
a stable sort for those across different TUs. */
the order we visited the SCC. Produce hash of the whole SCC as
combination of hashes of individual elements. Then combine that hash into
hash of each element, so othewise identically looking elements from two
different SCCs are distinguished. */
qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
hashval_t *tem = XALLOCAVEC (hashval_t, size);
hashval_t scc_hash = sccstack[first].hash;
for (unsigned i = 1; i < size; ++i)
scc_hash = iterative_hash_hashval_t (scc_hash,
sccstack[first+i].hash);
for (unsigned i = 0; i < size; ++i)
{
hashval_t hash = sccstack[first+i].hash;
hashval_t orig_hash = hash;
unsigned j;
/* Skip same hashes. */
for (j = i + 1;
j < size && sccstack[first+j].hash == orig_hash; ++j)
;
for (; j < size; ++j)
hash = iterative_hash_hashval_t (sccstack[first+j].hash, hash);
for (j = 0; sccstack[first+j].hash != orig_hash; ++j)
hash = iterative_hash_hashval_t (sccstack[first+j].hash, hash);
tem[i] = hash;
}
hashval_t scc_hash = 0;
for (unsigned i = 0; i < size; ++i)
{
sccstack[first+i].hash = tem[i];
scc_hash = iterative_hash_hashval_t (tem[i], scc_hash);
}
sccstack[first+i].hash = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
return scc_hash;
}