gimple.c (iterative_hash_gimple_type): Simplify singleton case some more, fix final...
authorRichard Guenther <rguenther@suse.de>
Tue, 17 May 2011 12:39:50 +0000 (12:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 17 May 2011 12:39:50 +0000 (12:39 +0000)
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
gcc/gimple.c

index 4ffe711771674600366c105bebf6874400468c8a..3625d9be2482e7b844b2a7c5c5b97f260af471df 100644 (file)
@@ -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
index b97fc8c9e10173e3024397d08910723f452d7d11..0c07ac24989a9e44463fc2e1ebb3664d145c50af 100644 (file)
@@ -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;