This fixes an oversight in the new SCC hash mixing code - we of course
need to return the adjusted hash of our type, not the purely local one.

There's still something weird going on, hash values somehow depend
on the order we feed it types ...

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2011-05-17  Richard Guenther  <rguent...@suse.de>

        * gimple.c (iterative_hash_gimple_type): Simplify singleton
        case some more, fix final hash value of the non-singleton case.

Index: gcc/gimple.c
===================================================================
--- gcc/gimple.c        (revision 173827)
+++ gcc/gimple.c        (working copy)
@@ -4213,25 +4213,24 @@ iterative_hash_gimple_type (tree type, h
   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, h
          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, h
              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;

Reply via email to