The following patch improves hashing types by re-instantiating the patch that makes us visit aggregate target types of pointers and function return and argument types. This halves the collision rate on the type hash table for a linux-kernel build and improves WPA compile-time from 3mins to 1mins and reduces memory usage by 1GB for that testcase.
Bootstrapped and tested on x86_64-unknown-linux-gnu, SPEC2k6 build-tested. Richard. (patch is reversed) 2011-05-16 Richard Guenther <rguent...@suse.de> * gimple.c (iterative_hash_gimple_type): Re-instantiate change to always visit pointer target and function result and argument types. Index: gcc/gimple.c =================================================================== --- gcc/gimple.c (revision 173725) +++ gcc/gimple.c (working copy) @@ -4110,10 +4110,20 @@ iterative_hash_gimple_type (tree type, h } /* 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, h 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++; }