From 008bad7a3e6acb60189dd289f3b2367b2f18a923 Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
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  <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
---
 gcc/ChangeLog |  5 +++++
 gcc/gimple.c  | 11 +++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4ffe71177167..3625d9be2482 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+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.
+
 2011-05-17  Richard Guenther  <rguenther@suse.de>
 
 	PR bootstrap/49013
diff --git a/gcc/gimple.c b/gcc/gimple.c
index b97fc8c9e101..0c07ac24989a 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;
-- 
GitLab