aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-05-17 12:39:50 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-05-17 12:39:50 +0000
commit008bad7a3e6acb60189dd289f3b2367b2f18a923 (patch)
tree40e598775a44730d033a1ef51662344a331f5c16 /gcc/gimple.c
parent364613408363334036d8f182ea2aba5d71d894fe (diff)
downloadgcc-008bad7a3e6acb60189dd289f3b2367b2f18a923.zip
gcc-008bad7a3e6acb60189dd289f3b2367b2f18a923.tar.gz
gcc-008bad7a3e6acb60189dd289f3b2367b2f18a923.tar.bz2
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 <rguenther@suse.de> * gimple.c (iterative_hash_gimple_type): Simplify singleton case some more, fix final hash value of the non-singleton case. From-SVN: r173829
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c
index b97fc8c..0c07ac2 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;