From e834e95c36679e28a45cdd27b6d59ffd6b9c00f1 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 13 May 2011 11:02:28 +0000 Subject: [PATCH] re PR lto/48978 (excessive hash table allocation for large lto build) 2011-05-13 Richard Guenther 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 | 6 ++++++ gcc/gimple.c | 42 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b1a1b3b6687..10660451117 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-05-13 Richard Guenther + + 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 * config/i386/i386.md (*movxf_internal): Use !can_create_pseudo (). diff --git a/gcc/gimple.c b/gcc/gimple.c index c9ac991d3d0..28a67441880 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -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++; } -- 2.30.2