From 008bad7a3e6acb60189dd289f3b2367b2f18a923 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 17 May 2011 12:39:50 +0000 Subject: [PATCH] gimple.c (iterative_hash_gimple_type): Simplify singleton case some more, fix final hash value of the non-singleton case. 2011-05-17 Richard Guenther * gimple.c (iterative_hash_gimple_type): Simplify singleton case some more, fix final hash value of the non-singleton case. From-SVN: r173829 --- gcc/ChangeLog | 5 +++++ gcc/gimple.c | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ffe7117716..3625d9be248 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-05-17 Richard Guenther + + * gimple.c (iterative_hash_gimple_type): Simplify singleton + case some more, fix final hash value of the non-singleton case. + 2011-05-17 Richard Guenther PR bootstrap/49013 diff --git a/gcc/gimple.c b/gcc/gimple.c index b97fc8c9e10..0c07ac24989 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4213,25 +4213,24 @@ iterative_hash_gimple_type (tree type, hashval_t val, if (state->low == state->dfsnum) { tree x; - struct sccs *cstate; struct tree_int_map *m; /* Pop off the SCC and set its hash values. */ x = VEC_pop (tree, *sccstack); - cstate = (struct sccs *)*pointer_map_contains (sccstate, x); - cstate->on_sccstack = false; /* Optimize SCC size one. */ if (x == type) { + state->on_sccstack = false; m = ggc_alloc_cleared_tree_int_map (); m->base.from = x; - m->to = cstate->u.hash; + m->to = v; slot = htab_find_slot (type_hash_cache, m, INSERT); gcc_assert (!*slot); *slot = (void *) m; } else { + struct sccs *cstate; unsigned first, i, size, j; struct type_hash_pair *pairs; /* Pop off the SCC and build an array of type, hash pairs. */ @@ -4241,6 +4240,8 @@ iterative_hash_gimple_type (tree type, hashval_t val, size = VEC_length (tree, *sccstack) - first + 1; pairs = XALLOCAVEC (struct type_hash_pair, size); i = 0; + cstate = (struct sccs *)*pointer_map_contains (sccstate, x); + cstate->on_sccstack = false; pairs[i].type = x; pairs[i].hash = cstate->u.hash; do @@ -4275,6 +4276,8 @@ iterative_hash_gimple_type (tree type, hashval_t val, for (j = 0; pairs[j].hash != pairs[i].hash; ++j) hash = iterative_hash_hashval_t (pairs[j].hash, hash); m->to = hash; + if (pairs[i].type == type) + v = hash; slot = htab_find_slot (type_hash_cache, m, INSERT); gcc_assert (!*slot); *slot = (void *) m; -- 2.30.2