aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-07-09 21:09:50 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-07-09 19:09:50 +0000
commitda22f50517faeb3fc185521631e3b86b89bd60ec (patch)
treeeb9c33519ed93b72589ae736d44e885a88dd9b5a /gcc
parent63dfbb95054c0ee31a1e8647316e1ef7015875a5 (diff)
downloadgcc-da22f50517faeb3fc185521631e3b86b89bd60ec.zip
gcc-da22f50517faeb3fc185521631e3b86b89bd60ec.tar.gz
gcc-da22f50517faeb3fc185521631e3b86b89bd60ec.tar.bz2
* lto-streamer-out.c (hash_scc): Avoid quadratic hashing loop.
From-SVN: r212404
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/lto-streamer-out.c34
2 files changed, 14 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d166c48..96b437f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
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:
* stor-layout.c (finish_builtin_struct): Copy fields into the variants.
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index 3064562..bd28909 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -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);
- 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;
+
+ 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)
- {
- 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;
}