From: Richard Guenther Date: Fri, 10 Sep 2010 13:44:07 +0000 (+0000) Subject: tree.c (type_hash_eq): For ARRAY_TYPEs also compare TYPE_SIZE. X-Git-Tag: releases/gcc-4.6.0~4425 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8c4353b7c50bc8855a0abdd9d9514477de715a33;p=thirdparty%2Fgcc.git tree.c (type_hash_eq): For ARRAY_TYPEs also compare TYPE_SIZE. 2010-09-10 Richard Guenther * tree.c (type_hash_eq): For ARRAY_TYPEs also compare TYPE_SIZE. (build_index_type): Implement in terms of build_range_type. (build_range_type): Do not allow NULL_TREE type, improve hashing to cover more cases. Set TYPE_STRUCTURAL_EQUALITY_P if we didn't hash. * c-decl.c (grokdeclarator): When modifying TYPE_SIZE manually create a distinct copy of the type. From-SVN: r164174 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 166bda19abbe..3f9e53d1213d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2010-09-10 Richard Guenther + + * tree.c (type_hash_eq): For ARRAY_TYPEs also compare + TYPE_SIZE. + (build_index_type): Implement in terms of build_range_type. + (build_range_type): Do not allow NULL_TREE type, improve + hashing to cover more cases. Set TYPE_STRUCTURAL_EQUALITY_P + if we didn't hash. + * c-decl.c (grokdeclarator): When modifying TYPE_SIZE manually + create a distinct copy of the type. + 2010-09-10 Kai Tietz * configure: Regenerated. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index c7babb54fff3..03836b5e6449 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -5458,6 +5458,7 @@ grokdeclarator (const struct c_declarator *declarator, if (size && integer_zerop (size)) { gcc_assert (itype); + type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type)); TYPE_SIZE (type) = bitsize_zero_node; TYPE_SIZE_UNIT (type) = size_zero_node; SET_TYPE_STRUCTURAL_EQUALITY (type); @@ -5466,6 +5467,7 @@ grokdeclarator (const struct c_declarator *declarator, { gcc_assert (itype); /* The type is complete. C99 6.7.5.2p4 */ + type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type)); TYPE_SIZE (type) = bitsize_zero_node; TYPE_SIZE_UNIT (type) = size_zero_node; SET_TYPE_STRUCTURAL_EQUALITY (type); diff --git a/gcc/tree.c b/gcc/tree.c index 7ea69c8cbc5e..bc2149109d6a 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -7034,41 +7034,6 @@ build_type_no_quals (tree t) } } -/* Create a type of integers to be the TYPE_DOMAIN of an ARRAY_TYPE. - MAXVAL should be the maximum value in the domain - (one less than the length of the array). - - The maximum value that MAXVAL can have is INT_MAX for a HOST_WIDE_INT. - We don't enforce this limit, that is up to caller (e.g. language front end). - The limit exists because the result is a signed type and we don't handle - sizes that use more than one HOST_WIDE_INT. */ - -tree -build_index_type (tree maxval) -{ - tree itype = make_node (INTEGER_TYPE); - - TREE_TYPE (itype) = sizetype; - TYPE_PRECISION (itype) = TYPE_PRECISION (sizetype); - TYPE_MIN_VALUE (itype) = size_zero_node; - TYPE_MAX_VALUE (itype) = fold_convert (sizetype, maxval); - SET_TYPE_MODE (itype, TYPE_MODE (sizetype)); - TYPE_SIZE (itype) = TYPE_SIZE (sizetype); - TYPE_SIZE_UNIT (itype) = TYPE_SIZE_UNIT (sizetype); - TYPE_ALIGN (itype) = TYPE_ALIGN (sizetype); - TYPE_USER_ALIGN (itype) = TYPE_USER_ALIGN (sizetype); - - if (host_integerp (maxval, 1)) - return type_hash_canon (tree_low_cst (maxval, 1), itype); - else - { - /* Since we cannot hash this type, we need to compare it using - structural equality checks. */ - SET_TYPE_STRUCTURAL_EQUALITY (itype); - return itype; - } -} - #define MAX_INT_CACHED_PREC \ (HOST_BITS_PER_WIDE_INT > 64 ? HOST_BITS_PER_WIDE_INT : 64) static GTY(()) tree nonstandard_integer_type_cache[2 * MAX_INT_CACHED_PREC + 2]; @@ -7111,16 +7076,15 @@ build_nonstandard_integer_type (unsigned HOST_WIDE_INT precision, /* Create a range of some discrete type TYPE (an INTEGER_TYPE, ENUMERAL_TYPE or BOOLEAN_TYPE), with low bound LOWVAL and - high bound HIGHVAL. If TYPE is NULL, sizetype is used. */ + high bound HIGHVAL. */ tree build_range_type (tree type, tree lowval, tree highval) { tree itype = make_node (INTEGER_TYPE); + hashval_t hash; TREE_TYPE (itype) = type; - if (type == NULL_TREE) - type = sizetype; TYPE_MIN_VALUE (itype) = fold_convert (type, lowval); TYPE_MAX_VALUE (itype) = highval ? fold_convert (type, highval) : NULL; @@ -7132,12 +7096,35 @@ build_range_type (tree type, tree lowval, tree highval) TYPE_ALIGN (itype) = TYPE_ALIGN (type); TYPE_USER_ALIGN (itype) = TYPE_USER_ALIGN (type); - if (host_integerp (lowval, 0) && highval != 0 && host_integerp (highval, 0)) - return type_hash_canon (tree_low_cst (highval, 0) - - tree_low_cst (lowval, 0), - itype); - else - return itype; + if ((TYPE_MIN_VALUE (itype) + && TREE_CODE (TYPE_MIN_VALUE (itype)) != INTEGER_CST) + || (TYPE_MAX_VALUE (itype) + && TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)) + { + /* Since we cannot reliably merge this type, we need to compare it using + structural equality checks. */ + SET_TYPE_STRUCTURAL_EQUALITY (itype); + return itype; + } + hash = iterative_hash_expr (TYPE_MIN_VALUE (itype), 0); + hash = iterative_hash_expr (TYPE_MAX_VALUE (itype), hash); + hash = iterative_hash_hashval_t (TYPE_HASH (type), hash); + return type_hash_canon (hash, itype); +} + +/* Create a type of integers to be the TYPE_DOMAIN of an ARRAY_TYPE. + MAXVAL should be the maximum value in the domain + (one less than the length of the array). + + The maximum value that MAXVAL can have is INT_MAX for a HOST_WIDE_INT. + We don't enforce this limit, that is up to caller (e.g. language front end). + The limit exists because the result is a signed type and we don't handle + sizes that use more than one HOST_WIDE_INT. */ + +tree +build_index_type (tree maxval) +{ + return build_range_type (sizetype, size_zero_node, maxval); } /* Return true if the debug information for TYPE, a subtype, should be emitted