diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-28 13:52:20 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-28 13:52:20 +0000 |
commit | 7b7fcfe18ace63ba73e5c326e5a07a34224c3cd6 (patch) | |
tree | 173b119f1eca7e90448f2b336299d2a06df7254e /gcc/gimple.c | |
parent | 9e434a362533ca39241b0331b31fb7b7270048b1 (diff) | |
download | gcc-7b7fcfe18ace63ba73e5c326e5a07a34224c3cd6.tar.gz |
2009-10-28 Richard Guenther <rguenther@suse.de>
* tree.c (free_lang_data_in_type): Do not call get_alias_set.
(free_lang_data): Unconditionally compute alias sets for all
standard integer types. Bail out if gate bailed out previously.
Do not reset the types_compatible_p langhook.
(gate_free_lang_data): Remove.
(struct pass_ipa_free_lang_data): Enable unconditionally.
* gimple.c (gimple_get_alias_set): Use the same alias-set for
all pointer types.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153659 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r-- | gcc/gimple.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c index 0b7667782aa..24ac0b80ac6 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4131,7 +4131,6 @@ gimple_signed_type (tree type) alias_set_type gimple_get_alias_set (tree t) { - static bool recursing_p; tree u; /* Permit type-punning when accessing a union, provided the access @@ -4171,15 +4170,9 @@ gimple_get_alias_set (tree t) } else if (POINTER_TYPE_P (t)) { - tree t1; + /* From the common C and C++ langhook implementation: - /* ??? We can end up creating cycles with TYPE_MAIN_VARIANT - and TYPE_CANONICAL. Avoid recursing endlessly between - this langhook and get_alias_set. */ - if (recursing_p) - return -1; - - /* Unfortunately, there is no canonical form of a pointer type. + Unfortunately, there is no canonical form of a pointer type. In particular, if we have `typedef int I', then `int *', and `I *' are different types. So, we have to pick a canonical representative. We do this below. @@ -4201,15 +4194,36 @@ gimple_get_alias_set (tree t) can dereference IPP and CIPP. So, we ignore cv-qualifiers on the pointed-to types. This issue has been reported to the C++ committee. */ - t1 = build_type_no_quals (t); - if (t1 != t) - { - alias_set_type set; - recursing_p = true; - set = get_alias_set (t1); - recursing_p = false; - return set; - } + + /* In addition to the above canonicalization issue with LTO + we should also canonicalize `T (*)[]' to `T *' avoiding + alias issues with pointer-to element types and pointer-to + array types. + + Likewise we need to deal with the situation of incomplete + pointed-to types and make `*(struct X **)&a' and + `*(struct X {} **)&a' alias. Otherwise we will have to + guarantee that all pointer-to incomplete type variants + will be replaced by pointer-to complete type variants if + they are available. + + With LTO the convenient situation of using `void *' to + access and store any pointer type will also become + more appearant (and `void *' is just another pointer-to + incomplete type). Assigning alias-set zero to `void *' + and all pointer-to incomplete types is a not appealing + solution. Assigning an effective alias-set zero only + affecting pointers might be - by recording proper subset + relationships of all pointer alias-sets. + + Pointer-to function types are another grey area which + needs caution. Globbing them all into one alias-set + or the above effective zero set would work. */ + + /* For now just assign the same alias-set to all pointers. + That's simple and avoids all the above problems. */ + if (t != ptr_type_node) + return get_alias_set (ptr_type_node); } return -1; |