re PR lto/48978 (excessive hash table allocation for large lto build)
authorRichard Guenther <rguenther@suse.de>
Fri, 13 May 2011 11:02:28 +0000 (11:02 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 13 May 2011 11:02:28 +0000 (11:02 +0000)
2011-05-13  Richard Guenther  <rguenther@suse.de>

PR lto/48978
* gimple.c (iterative_hash_gimple_type): Revert change in
pointer target and function result and argument hashing.

From-SVN: r173730

gcc/ChangeLog
gcc/gimple.c

index b1a1b3b6687781ff98b5bedac65a38aa0eda9705..10660451117580a9f1efcf5411f6ddd5e204f206 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-13  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/48978
+       * gimple.c (iterative_hash_gimple_type): Revert change in
+       pointer target and function result and argument hashing.
+
 2011-05-13  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (*movxf_internal): Use !can_create_pseudo ().
index c9ac991d3d039b3d5a213637f466b4e1d36c6072..28a67441880cec40eaddfc517623a97932b8a4de 100644 (file)
@@ -4110,10 +4110,20 @@ iterative_hash_gimple_type (tree type, hashval_t val,
     }
 
   /* For pointer and reference types, fold in information about the type
-     pointed to.  */
+     pointed to but do not recurse into possibly incomplete types to
+     avoid hash differences for complete vs. incomplete types.  */
   if (POINTER_TYPE_P (type))
-    v = visit (TREE_TYPE (type), state, v,
-              sccstack, sccstate, sccstate_obstack);
+    {
+      if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (type)))
+       {
+         v = iterative_hash_hashval_t (TREE_CODE (TREE_TYPE (type)), v);
+         v = iterative_hash_name
+               (TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (type))), v);
+       }
+      else
+       v = visit (TREE_TYPE (type), state, v,
+                  sccstack, sccstate, sccstate_obstack);
+    }
 
   /* For integer types hash the types min/max values and the string flag.  */
   if (TREE_CODE (type) == INTEGER_TYPE)
@@ -4154,13 +4164,29 @@ iterative_hash_gimple_type (tree type, hashval_t val,
        v = visit (TYPE_METHOD_BASETYPE (type), state, v,
                   sccstack, sccstate, sccstate_obstack);
 
-      /* Check result and argument types.  */
-      v = visit (TREE_TYPE (type), state, v,
-                sccstack, sccstate, sccstate_obstack);
+      /* For result types allow mismatch in completeness.  */
+      if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (type)))
+       {
+         v = iterative_hash_hashval_t (TREE_CODE (TREE_TYPE (type)), v);
+         v = iterative_hash_name
+               (TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (type))), v);
+       }
+      else
+       v = visit (TREE_TYPE (type), state, v,
+                  sccstack, sccstate, sccstate_obstack);
+
       for (p = TYPE_ARG_TYPES (type), na = 0; p; p = TREE_CHAIN (p))
        {
-         v = visit (TREE_VALUE (p), state, v,
-                    sccstack, sccstate, sccstate_obstack);
+         /* For argument types allow mismatch in completeness.  */
+         if (RECORD_OR_UNION_TYPE_P (TREE_VALUE (p)))
+           {
+             v = iterative_hash_hashval_t (TREE_CODE (TREE_VALUE (p)), v);
+             v = iterative_hash_name
+                   (TYPE_NAME (TYPE_MAIN_VARIANT (TREE_VALUE (p))), v);
+           }
+         else
+           v = visit (TREE_VALUE (p), state, v,
+                      sccstack, sccstate, sccstate_obstack);
          na++;
        }