From 0ceb0201344a65bab37d6933601df77a512c334e Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 25 Aug 2010 14:46:40 +0000 Subject: [PATCH] alias.c (get_alias_set): Assign a single alias-set to all pointers. 2010-08-25 Richard Guenther * alias.c (get_alias_set): Assign a single alias-set to all pointers. * gimple.c (gimple_get_alias_set): Remove special handling for pointers. c-family/ * c-common.c (c_common_get_alias_set): Remove special handling for pointers. * gcc.dg/alias-8.c: Adjust. From-SVN: r163549 --- gcc/ChangeLog | 7 +++++ gcc/alias.c | 56 +++++++++++++++++++++++++++++++++ gcc/c-family/ChangeLog | 5 +++ gcc/c-family/c-common.c | 31 ------------------ gcc/gimple.c | 57 ---------------------------------- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.dg/alias-8.c | 2 +- 7 files changed, 73 insertions(+), 89 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 551e93b9f61..514c1f5dd68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-08-25 Richard Guenther + + * alias.c (get_alias_set): Assign a single alias-set to + all pointers. + * gimple.c (gimple_get_alias_set): Remove special handling + for pointers. + 2010-08-25 Bernd Schmidt PR middle-end/45355 diff --git a/gcc/alias.c b/gcc/alias.c index fac5a024c46..98706a04034 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -761,6 +761,62 @@ get_alias_set (tree t) else if (TREE_CODE (t) == ARRAY_TYPE && !TYPE_NONALIASED_COMPONENT (t)) set = get_alias_set (TREE_TYPE (t)); + /* From the former common C and C++ langhook implementation: + + 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. + + Technically, this approach is actually more conservative that + it needs to be. In particular, `const int *' and `int *' + should be in different alias sets, according to the C and C++ + standard, since their types are not the same, and so, + technically, an `int **' and `const int **' cannot point at + the same thing. + + But, the standard is wrong. In particular, this code is + legal C++: + + int *ip; + int **ipp = &ip; + const int* const* cipp = ipp; + And, it doesn't make sense for that to be legal unless you + can dereference IPP and CIPP. So, we ignore cv-qualifiers on + the pointed-to types. This issue has been reported to the + C++ committee. + + 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 apparent (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. */ + else if (POINTER_TYPE_P (t) + && t != ptr_type_node) + return get_alias_set (ptr_type_node); + /* Otherwise make a new alias set for this type. */ else set = new_alias_set (); diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 072aad4d4ca..165ec2032b5 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2010-08-25 Richard Guenther + + * c-common.c (c_common_get_alias_set): Remove special + handling for pointers. + 2010-08-20 Nathan Froyd * c-common.c: Use FOR_EACH_VEC_ELT. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index e2c5d28d08e..3a79968b202 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -4087,37 +4087,6 @@ c_common_get_alias_set (tree t) if (t1 != t) return get_alias_set (t1); } - else if (POINTER_TYPE_P (t)) - { - tree t1; - - /* 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. - - Technically, this approach is actually more conservative that - it needs to be. In particular, `const int *' and `int *' - should be in different alias sets, according to the C and C++ - standard, since their types are not the same, and so, - technically, an `int **' and `const int **' cannot point at - the same thing. - - But, the standard is wrong. In particular, this code is - legal C++: - - int *ip; - int **ipp = &ip; - const int* const* cipp = ipp; - - And, it doesn't make sense for that to be legal unless you - 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) - return get_alias_set (t1); - } /* Handle the case of multiple type nodes referring to "the same" type, which occurs with IMA. These share an alias set. FIXME: Currently only diff --git a/gcc/gimple.c b/gcc/gimple.c index 50b2eab4c52..7433b14c367 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4582,63 +4582,6 @@ gimple_get_alias_set (tree t) if (t1 != t) return get_alias_set (t1); } - else if (POINTER_TYPE_P (t)) - { - /* From the common C and C++ langhook implementation: - - 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. - - Technically, this approach is actually more conservative that - it needs to be. In particular, `const int *' and `int *' - should be in different alias sets, according to the C and C++ - standard, since their types are not the same, and so, - technically, an `int **' and `const int **' cannot point at - the same thing. - - But, the standard is wrong. In particular, this code is - legal C++: - - int *ip; - int **ipp = &ip; - const int* const* cipp = ipp; - And, it doesn't make sense for that to be legal unless you - can dereference IPP and CIPP. So, we ignore cv-qualifiers on - the pointed-to types. This issue has been reported to the - C++ committee. */ - - /* 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 apparent (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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a3153af2613..372024fd7cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-08-25 Richard Guenther + + * gcc.dg/alias-8.c: Adjust. + 2010-08-25 Bernd Schmidt * gcc.target/i386/combine-mul.c: New test. diff --git a/gcc/testsuite/gcc.dg/alias-8.c b/gcc/testsuite/gcc.dg/alias-8.c index 690f1b62da9..8eba671a058 100644 --- a/gcc/testsuite/gcc.dg/alias-8.c +++ b/gcc/testsuite/gcc.dg/alias-8.c @@ -8,5 +8,5 @@ struct s { void func(struct s *ptr) { - *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" } */ + *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" "" { xfail *-*-* } } */ } -- 2.30.2