From 0ea80a160332d4676919e31a7bdff1d8d7100af0 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 20 May 2011 09:35:44 +0000 Subject: [PATCH] re PR middle-end/48849 (SPEC CPU 2000/2006 failed to build with LTO) 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. From-SVN: r173939 --- gcc/ChangeLog | 6 ++++++ gcc/gimple.c | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) 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);