diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b89b3f9a0b1..3bd18b854b8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-05-20 Richard Guenther + + PR middle-end/48849 + * gimple.c (gimple_register_canonical_type): Compute TYPE_CANONICAL + of pointer types the same way the middle-end does. + 2011-05-20 Richard Guenther * gimple.c (gimple_register_type_1): Do not fiddle with diff --git a/gcc/gimple.c b/gcc/gimple.c index 5b03e15a1fc..4c7fbfc8235 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4801,6 +4801,25 @@ gimple_register_canonical_type (tree t) if (TYPE_CANONICAL (t)) return TYPE_CANONICAL (t); + /* For pointer and reference types do as the middle-end does - the + canonical type is a pointer to the canonical pointed-to type. */ + if (TREE_CODE (t) == POINTER_TYPE) + { + TYPE_CANONICAL (t) + = build_pointer_type_for_mode + (gimple_register_canonical_type (TREE_TYPE (t)), + TYPE_MODE (t), TYPE_REF_CAN_ALIAS_ALL (t)); + return TYPE_CANONICAL (t); + } + else if (TREE_CODE (t) == REFERENCE_TYPE) + { + TYPE_CANONICAL (t) + = build_reference_type_for_mode + (gimple_register_canonical_type (TREE_TYPE (t)), + TYPE_MODE (t), TYPE_REF_CAN_ALIAS_ALL (t)); + return TYPE_CANONICAL (t); + } + if (gimple_canonical_types == NULL) gimple_canonical_types = htab_create_ggc (16381, gimple_canonical_type_hash, gimple_canonical_type_eq, 0);